1.无重复字符的最长子串 (滑动窗口 + HashSet)
2.复原IP地址(暴力||回溯)
3.两数之和(HashMap)
4.三数之和(排序+双指针)
5.岛屿的最大面积(深度优先+递归+清除已经访问过的位置)
6.搜索旋转排序数组(有条件的二分查找)
7.反转链表(cur、pre、temp)
8.合并两个有序链表(递归||迭代)
9.买卖股票的最佳时机(遍历数组,记录当前遍历元素之前的最小值)
for (int i = 1; i < len; i++) {
res = Math.max(res, prices[i] - minVal);
minVal = Math.min(minVal, prices[i]);
}
10.最大子序和(动态规划)
(动态规划的是首先对数组进行遍历,当前最大连续子序列和为 sum,结果为 ans
如果 sum > 0,则说明 sum 对结果有增益效果,则 sum 保留并加上当前遍历数字
如果 sum <= 0,则说明 sum 对结果无增益效果,需要舍弃,则 sum 直接更新为当前遍历数字)
11.合并两个有序数组(双指针+从后往前比较)
12.爬楼梯(斐波那契数列)
13.相交链表(双指针 若相交,链表A: a+c, 链表B : b+c. a+c+b+c = b+c+a+c 。则会在公共处c起点相遇。若不相交,a +b = b+a 。因此相遇处是NULL)
14.如何从一百万个数里面找到最小的一百个数,考虑算法的时间复杂度和空间复杂度(维护一个100长度的大顶堆,从第101个元素开始遍历,比顶大的直接丢弃,小的注解替换堆顶,然后重新维护堆)
(维护一个100长度的数组,从第101个元素开始遍历,与数组中最大的元素比较,大的直接丢弃,小的则替换之前最大元素)
15.x 的平方根(二分查找)
网友评论