leecode
妖码
未来可期
展开
-
两个数组的交集 II
主要思路: 首先对两个数组进行排序,然后从头使用双指针 举例排序后的两个数组,指针为A、B 当A<B的时候,A指针向后移动 当A=B的时候,A、B指针都向后移动,并且保存共同的元素到集合中 当A>B的时候,B指针向后移动 这样持续到某一个数组遍历完成 class Solution { public int[] intersect(int[] nums1, int[] nums2) { ArrayList<Integer> list = new Arra原创 2022-04-14 17:30:58 · 217 阅读 · 0 评论 -
只出现一次的数字
主要思路: 通过异或运算,0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),那么我们现在里面只有一个是单独的,其他的都是重复的两个,两个异或就会为0,最终就是0⊕单独数字=单独数字 class Solution { public int singleNumber(int[] nums) { int len = nums.length; int res = 0; for(int i=0;i<len;i++){原创 2022-04-14 16:53:06 · 103 阅读 · 0 评论 -
存在重复元素
存在重复元素 主要思路: 思路一:数组排序,然后通过遍历看相邻两个元素是否相同 class Solution { public boolean containsDuplicate(int[] nums) { int len = nums.length; if(len==0 || len==1){ return false; } Arrays.sort(nums); for(int i=1;i&原创 2022-04-11 21:04:24 · 545 阅读 · 0 评论 -
旋转数组解决方法
旋转数组 主要思路: 思路一:首先将数组全部反转,然后前半部分反转,后半部分反转 例如: 1234567 移动3次(这里注意一下可能移动10个,移动7次和原本的数组一样,所以 我们对位移求模,10%7==3) 全部反转 7654321 反转前3个 5674321 反转后面部分 5671234 class Solution { public void rotate(int[] nums, int k) { int len = nums.length; k =原创 2022-04-11 19:48:29 · 226 阅读 · 0 评论 -
买卖股票的最佳时机 II
买卖股票的最佳时机 II 主要思路:求上升区间的高度差的累加和,对于每一个递增区间都算出来每两个之间的差值,然后累加起来 解释一下为什么要划分为一个一个的递增区间: 我们用1 3 2 10 和 1 3 3 10来对比 我们发现在图一中,有明显下滑,我们如果要求最大的利润,是第一天买入,第二天卖出,第三天买入,第四天卖出,共计3-1 + 10-2 = 10,为什么不会考虑非要在一个递增区间的开始买入和最高卖出呢,为什么不可以在下一个递增区间卖出呢,我们由图一看到第三天的下滑,那么我们计算一个区间的从低到高原创 2022-04-10 15:20:22 · 308 阅读 · 0 评论 -
删除排序数组中的重复项
删除排序数组中的重复项 主要思路是:我们将不重复的数据存储在数组的前面部分,实现过程是通过slow指针指向前面的不重复部分的最后一个,而fast指针是负责找到后面哪个元素还没有重复过: 如果fast的和slow的元素相同,那么fast往后接着走,直到找到下一个不同的 如果fast的和slow的元素不同,那么由于slow是最后一个不重复的元素,而要新加一个不重复的元素,slow先向后+1,然后再将fast的元素覆盖到slow所在位置,slow成了新的不重复部分的最后一个,直到fast走完整个数组 clas原创 2022-04-10 14:27:37 · 142 阅读 · 0 评论