当前位置: 首页 > news >正文

相向双指针 -- 灵神刷题

两数之和

https://leetcode.cn/problems/two-sum-ii-input-array-is-sorted/description/

比较简单,因为数组是排好序的,那么就利用双指针left、right,一个指向开头,一个指向结尾;如果两个指针位置元素相加大于目标元素,说明指向大了,right左移;反之,left右移。

class Solution {public int[] twoSum(int[] numbers, int target) {int left = 0,right = numbers.length -1 ;while(left<right){if(numbers[left]+numbers[right]>target)--right;else if(numbers[left]+numbers[right]<target)++left;else return new int[]{left+1,right+1};}return new int[]{-1,-1};}
}

三数之和

https://leetcode.cn/problems/3sum/

class Solution {public List<List<Integer>> threeSum(int[] nums) {Arrays.sort(nums);List<List<Integer>> res = new ArrayList<>();int n = nums.length;for(int i = 0;i<n-2;++i){int target = nums[i];int j = i+1,k=n-1;//去重操作if(i>0&&nums[i]==nums[i-1])continue;if(target+nums[i+1]+nums[i+2]>0)break;//当前值和两个最小值都大于0 直接break 因为target继续也是继续变大  加最小的都大于0  变大更是大于0了if(target+nums[k]+nums[k-1]<0)continue;///当前值和两个最大值都小于0 直接continue  枚举下一个target 因为target还可能变大 所以可能出现大于等于0while(j<k){if(nums[j]+nums[k]>-target)--k;else if(nums[j]+nums[k]<-target)++j;else {res.add(Arrays.asList(target,nums[j],nums[k]));j++;//去重操作while(j<k&&nums[j]==nums[j-1])++j;k--;//去重操作while(j<k&&nums[k]==nums[k+1])--k;}}}return res;}
}

统计和小于目标的下标对数目

https://leetcode.cn/problems/count-pairs-whose-sum-is-less-than-target/description/

class Solution {public int countPairs(List<Integer> nums, int target) {//先排序 排序之后相向双指针才更好的使用nums.sort((a,b)->a-b);int res = 0;//存储结果int i = 0,j = nums.size()-1;while(i<j){//当满足小于target的时候,i 到 i+1~j 之间的每一个元素肯定都是满足的if(nums.get(i)+nums.get(j)<target)res+=j-i++;else --j;}return res;}
}

最接近的三数之和

https://leetcode.cn/problems/3sum-closest/

基于三树之和改编的,不过灵神多了两部的剪枝优化 我这里没有写上去

class Solution {public int threeSumClosest(int[] nums, int target) {Arrays.sort(nums);int res = Integer.MAX_VALUE;int n = nums.length;for(int i = 0;i<n-2;++i){if(i>0&&nums[i]==nums[i-1])continue;//优化一int num = nums[i];int left = i+1,right = n-1;while(left<right){int s = nums[left]+num+nums[right];res= (Math.abs(res-target)>Math.abs(s-target))?s:res;if(s>target)--right;else if(s<target)++left;else return target;}}return res;}
}

四数之和

https://leetcode.cn/problems/4sum/description/

四数之和我们可以类似三数之和一样,定一个数 那么就是三数之和 然后就是三数之和的逻辑,再定一个就变成两数之和。就是一个套娃

注意结果使用long接收

class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {Arrays.sort(nums);List<List<Integer>> res = new ArrayList<>();int n = nums.length;for(int i = 0;i<n-3;++i){long  num1 = nums[i];if(i>0&&nums[i]==nums[i-1])continue;if(num1+nums[i+1]+nums[i+2]+nums[i+3]>target)break;if(num1+nums[n-1]+nums[n-2]+nums[n-3]<target)continue;for(int j = i+1;j<n-2;++j){long  naum2 = nums[j];if(j>i+1&&nums[j]==nums[j-1])continue;if (num1 + num2 + nums[j + 1] + nums[j + 2] > target) break; if (num1 + num2 + nums[n - 2] + nums[n - 1] < target) continue; int left = j+1,right = n-1;while(left<right){long s = num1+num2+nums[left]+nums[right];if(s==target){res.add(Arrays.asList((int)num1,(int)num2,nums[left],nums[right]));++left;while(left<right&&nums[left]==nums[left-1])++left;--right;while(left<right&&nums[right]==nums[right+1])--right;}else if(s>target){--right;}else{++left;}}}}return res;}
}

有效三角形的个数

https://leetcode.cn/problems/valid-triangle-number/description/

能成为一个三角形的条件:两边之和大于第三边

这样也就是三数之和的变种题目了 不过就是从后向前遍历罢了

class Solution {public int triangleNumber(int[] nums) {Arrays.sort(nums);int res = 0;int n = nums.length;for(int i = n-1;i>=2;--i){if(nums[i]>=nums[i-1]+nums[i-2])continue;//最大的两个边相加都小于第三边int l = 0,r = i-1;while(l<r){if(nums[l]+nums[r]>nums[i]){res+=r-l;--r;}else{++l;}}}return res; }
}

盛最多水的容器

https://leetcode.cn/problems/container-with-most-water/description/

面积由宽×高,高就是左右比较矮的哪一个 这样就可以了!

class Solution {public int maxArea(int[] height) {int n = height.length;int left = 0,right = n-1;int res = 0;while(left<right){int h,w = right-left;if(height[left]<height[right]){h = height[left];++left;}else{h = height[right];--right;}res = Math.max(res,w*h);}return res;}
}

接雨水

https://leetcode.cn/problems/trapping-rain-water/solutions/1974340/zuo-liao-nbian-huan-bu-hui-yi-ge-shi-pin-ukwm/

我们将每一个位置看作一个桶,桶的左边界就是左边做高的,右边界就是右边最高的,该位置可以存储的雨水位:min(左边界,右边界)-当前位置高度*1

class Solution {public int trap(int[] height) {int res= 0;int left = 0,right =height.length-1;int preMax = 0,sufMax = 0;//代表左边最高的板子和右边最高的板子while(left<right){preMax = Math.max(preMax,height[left]);sufMax = Math.max(sufMax,height[right]);if(preMax<sufMax){res+=preMax-height[left++];}else{res+=sufMax-height[right--];}}return res;}
}

相关文章:

  • xdvipdfmx:fatal: File ended prematurely. No output PDF file written.
  • 【笔记】如何解决GitHub报错403
  • JAVA网络编程——socket套接字的介绍上(详细)
  • Python:从脚本语言到工业级应用的传奇进化
  • Vue.js教学第十四章:Vuex模块化,打造高效大型应用状态管理
  • 网络安全给数据工厂带来的挑战
  • 操作系统与底层安全
  • STM32 USART串口通信
  • Todesk 软件被锁定,不记得安全密码也进不去软件改不了问题解决
  • n 阶矩阵 A 可逆的充分必要条件是 ∣ A ∣ ≠ 0
  • 关于 Web 安全:4. 中间件 框架风险点分析
  • 危化品经营单位安全生产管理人员考试主要内容
  • 嵌入式Openharmony系统应用开发与实现方法
  • 【Leetcode 每日一题】2942. 查找包含给定字符的单词
  • HarmonyOS介绍
  • 多场景游戏AI新突破!Divide-Fuse-Conquer如何激发大模型“顿悟时刻“?
  • 产品经理常用术语大全
  • Day 0017:Web漏洞扫描(OpenVAS)解析
  • 视觉导航调研#1
  • TIT-2014《Randomized Dimensionality Reduction for $k$-means Clustering》
  • 做门户网站maosi/长春网站搭建
  • 域名抢注网站源码/关键词排名优化技巧
  • 做网站用百度百科的资料会侵权吗/苏州整站优化
  • 做网站做一个什么主题的/沈阳企业网站seo公司
  • com网站域名注册/友链
  • 郑州市人民政府网站建设现状/软文发布推广平台