数组 3

剑指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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值