剑指offer3数组中重复的数
思路一:HashSet 简单
遍历数组,如果发现 set 含有该元素则返回,不含有则存入哈希表
思路2:原地置换
219数组中重复元素2
思路1:HashMap
HashMap<Integer,Integer> map = new HashMap<>();
和上题类似只不过是增加了一个判断相隔是否小于 K 位的条件。if如果符合return结束,if结束后保存索引的两种情况:不存在或者存在但不符合k位条件
绝对值的写法:
int abs = Math.abs(i - map.get(nums[i]));
if (abs <= k) return true;//小于等于则返回
思路2:HashSet 固定滑动窗口
HashSet<Integer> set = new HashSet<>();
维护窗口长度:因为已经超出窗口长度k,所以从最后一个开始把前面第k个移除
if (set.size() > k) {
set.remove(nums[i-k]);
485最大连续1的个数
思路1
效率高,用left和right指针,left指向第一个,(问题 初始化left=0 如果第0个不是1怎么办?),right向右搜索,=1就继续向右,=0就计算right-left,然后left=right,继续
判断符合要求的计数,不符合就继续下面代码,用了continue
最大值的写法 : maxcount = Math.max(maxcount, right - left);
return Math.max(maxcount, right-left);
思路2 简单原始的办法
560和为K的子数组
思路一:简单方法 双重循环
遍历,外层i是起点,内层j是终点,i j循环考虑到了所有子串的情况。效率低可能超时
思路二:前缀和 (presum数组)
例如需要获取 nums[2] 到 nums[4] 这个区间的和,可以由 presum[5] - presum[2] 得到
先计算presum数组,然后用双重循环遍历presum,所有情况也是ij起点终点,等于就计数+1。
思路3:前缀和 + HashMap
不想看了
后来补充:上一个解法需要双重循环遍历presum,用hashmap就不需要了,只要一个变量暂存当前的presum(一个数,每次循环更新 查找hashmap里有没有和presum相加=k的)
1052爱生气的书店老板
。。。
这为什么是一个中等难度题
1438绝对值不超过限制的最长子数组
需要用到滑动窗口的最大值 队列后面看吧
这个题也是
。。瘫肚子22:42