目录

算法专题一双指针

算法专题一:双指针

https://i-blog.csdnimg.cn/direct/cd16786550ee40718bfc5768181a5863.png 题目链接: https://i-blog.csdnimg.cn/direct/286f1db4709342ec8949f7f76ce28928.png 我们可以定义一个dest,一个cur,dest表示数组中不为零的数的最后一位,cur用来遍历数组 https://i-blog.csdnimg.cn/direct/d2a3a8470be946008f7992afb073bc51.png class Solution { public void moveZeroes(int[] nums) { for(int cur=0,dest=-1;cur= n - 1){ break; } cur++; } if(dest==n){ arr[n-1]=0; dest-=2; cur–; } while(cur>=0){ if(arr[cur]!=0){ arr[dest–]=arr[cur–]; }else{ arr[dest–]=0; arr[dest–]=0; cur–; } } } }

https://i-blog.csdnimg.cn/direct/5ad8cdd4ec6343509895a9901f6176b6.png 题目链接: https://i-blog.csdnimg.cn/direct/b73aa67a92a04b92a449ae03bee29f79.png https://i-blog.csdnimg.cn/direct/1d1a4d9ec0e7415fb6bcbad0d5403879.png 所以我们的算法原理:可以定义一个快指针,一个慢指针,快指针每次走两步,慢指针每次走一步,直至两个指针相遇,如果相遇时的数为1,则是快乐数,如果不是1,就不是快乐数。 代码如下: class Solution { public int sum(int n){ int sum=0; while(n!=0){ int t=n%10; sum+=t*t; n/=10; } return sum; } public boolean isHappy(int n) { int slow=n; int fast=sum(n); while(slow!=fast){ slow=sum(slow); fast=sum(sum(fast)); } return slow==1; } }

https://i-blog.csdnimg.cn/direct/da7d488fd1034538adb3a7f098af797e.png 题目链接:[11 盛最多水的容器 - 力扣(LeetCode)]( with-most-water/description/ “11. 盛最多水的容器 - 力扣(LeetCode)”) 大家看到这个题目一定会想到这道题的暴力解法,套两层for循环,进行暴力枚举,但是这种解法会超时。O(n2) 我们就要需要找到其中的规律 比如这种情况: https://i-blog.csdnimg.cn/direct/f1259aa9172e429d9713cd57506fda5e.png 我们从中取出一小部分进行讲解 https://i-blog.csdnimg.cn/direct/79e7da96dcaf4afb87b7b76d36ba707c.png 体积无非就是长 * 宽 我们通过左右的比较,发现6比3大,我们可以将3的位置往前移动一位。 这样移动的思想就是,我们如果将6往前移动一位,无非就是三种情况

  1. 宽度减小,高度不变
  2. 宽度减小,高度也减小
  3. 宽度减小,高度不变 无论我们怎么样移动体积都会减小,所以我们每次将两边较小的进行移动。 代码如下: class Solution { public int maxArea(int[] height) { int left=0; int right=height.length-1; int result=0; while(left < right){ int v=Math.min(height[left],height[right]) * (right-left); result=Math.max(v,result); if(height[left]=2;i–){ int left=0; int right=i-1; while(lefttarget){ right–; }else{ return new int[]{price[left],price[right]}; } } return new int[]{0}; } }

https://i-blog.csdnimg.cn/direct/b1024783687a44ac9ffad0edfddb8263.png 题目链接: https://i-blog.csdnimg.cn/direct/4072b1bdfb374900a960953a10eb09c7.png https://i-blog.csdnimg.cn/direct/cab9d56f8497496387542b4f94f5c6dc.png 小优化: https://i-blog.csdnimg.cn/direct/760e208375ca4460a682f5c2c1ce7b2e.png https://i-blog.csdnimg.cn/direct/e84dc6004d0340968dcf026851773f16.png class Solution { public List> threeSum(int[] nums) { Arrays.sort(nums); List> ret =new ArrayList<>(); int n=nums.length; for(int i=0;i0){ break; } while(lefttarget){ right–; }else if(sum(Arrays.asList(nums[i],nums[left],nums[right]))); left++; right–; while(left> fourSum(int[] nums, int target) { List> ret=new ArrayList<>(); Arrays.sort(nums); int n=nums.length; for(int i=0;iaim){ right–; }else if(sum<aim){ left++; }else{ ret.add(Arrays.asList(nums[i],nums[j],nums[left],nums[right])); left++; right–; while(left<right && nums[left]==nums[left-1]){ left++; } while(left<right && nums[right]==nums[right+1]){ right–; } } } j++; while(j<n && nums[j]==nums[j-1]){ j++; } } i++; while(i<n && nums[i]==nums[i-1]){ i++; } } return ret; } } 希望能对大家有所帮助!!! https://i-blog.csdnimg.cn/direct/30bab5d8e9f246849b942a3cf9085bee.jpeg