LeetCode_数组_中等题
生活随笔
收集整理的這篇文章主要介紹了
LeetCode_数组_中等题
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
目錄
- -----------------8.28-----------------------
- 16、最接近的三數(shù)之和
- 18.四數(shù)之和
- 209、長度最小的子數(shù)組
- 39、組合總和
- 40、組合總和II
- 287、尋找重復(fù)數(shù)
-----------------8.28-----------------------
16、最接近的三數(shù)之和
class Solution {public int threeSumClosest(int[] nums, int target) {Arrays.sort(nums);int n = nums.length;int best = 10000000;// 枚舉 afor (int i = 0; i < n; ++i) {// 保證和上一次枚舉的元素不相等if (i > 0 && nums[i] == nums[i - 1]) {continue;}// 使用雙指針枚舉 b 和 cint j = i + 1, k = n - 1;while (j < k) {int sum = nums[i] + nums[j] + nums[k];// 如果和為 target 直接返回答案if (sum == target) {return target;}// 根據(jù)差值的絕對(duì)值來更新答案if (Math.abs(sum - target) < Math.abs(best - target)) {best = sum;}if (sum > target) {// 如果和大于 target,移動(dòng) c 對(duì)應(yīng)的指針int k0 = k - 1;// 移動(dòng)到下一個(gè)不相等的元素while (j < k0 && nums[k0] == nums[k]) {--k0;}k = k0;} else {// 如果和小于 target,移動(dòng) b 對(duì)應(yīng)的指針int j0 = j + 1;// 移動(dòng)到下一個(gè)不相等的元素while (j0 < k && nums[j0] == nums[j]) {++j0;}j = j0;}}}return best;} }18.四數(shù)之和
class Solution {public List<List<Integer>> fourSum(int[] nums,int target){/*定義一個(gè)返回值*/List<List<Integer>> result=new ArrayList<>();/*當(dāng)數(shù)組為null或元素小于4個(gè)時(shí),直接返回*/if(nums==null||nums.length<4){return result;}/*對(duì)數(shù)組進(jìn)行從小到大排序*/Arrays.sort(nums);/*數(shù)組長度*/int length=nums.length;/*定義4個(gè)指針k,i,j,h k從0開始遍歷,i從k+1開始遍歷,留下j和h,j指向i+1,h指向數(shù)組最大值*/for(int k=0;k<length-3;k++){/*當(dāng)k的值與前面的值相等時(shí)忽略*/if(k>0&&nums[k]==nums[k-1]){continue;}/*獲取當(dāng)前最小值,如果最小值比目標(biāo)值大,說明后面越來越大的值根本沒戲*/int min1=nums[k]+nums[k+1]+nums[k+2]+nums[k+3];if(min1>target){break;}/*獲取當(dāng)前最大值,如果最大值比目標(biāo)值小,說明后面越來越小的值根本沒戲,忽略*/int max1=nums[k]+nums[length-1]+nums[length-2]+nums[length-3];if(max1<target){continue;}/*第二層循環(huán)i,初始值指向k+1*/for(int i=k+1;i<length-2;i++){/*當(dāng)i的值與前面的值相等時(shí)忽略*/if(i>k+1&&nums[i]==nums[i-1]){continue;}/*定義指針j指向i+1*/int j=i+1;/*定義指針h指向數(shù)組末尾*/int h=length-1;/*獲取當(dāng)前最小值,如果最小值比目標(biāo)值大,說明后面越來越大的值根本沒戲*/int min=nums[k]+nums[i]+nums[j]+nums[j+1];if(min>target){break;}/*獲取當(dāng)前最大值,如果最大值比目標(biāo)值小,說明后面越來越小的值根本沒戲,忽略*/int max=nums[k]+nums[i]+nums[h]+nums[h-1];if(max<target){continue;}/*開始j指針和h指針的表演,計(jì)算當(dāng)前和,如果等于目標(biāo)值,j++并去重,h--并去重,當(dāng)當(dāng)前和大于目標(biāo)值時(shí)h--,當(dāng)當(dāng)前和小于目標(biāo)值時(shí)j++*/while (j<h){int curr=nums[k]+nums[i]+nums[j]+nums[h];if(curr==target){result.add(Arrays.asList(nums[k],nums[i],nums[j],nums[h]));j++;while(j<h&&nums[j]==nums[j-1]){j++;}h--;while(j<h&&i<h&&nums[h]==nums[h+1]){h--;}}else if(curr>target){h--;}else {j++;}}}}return result;}}209、長度最小的子數(shù)組
39、組合總和
40、組合總和II
287、尋找重復(fù)數(shù)
總結(jié)
以上是生活随笔為你收集整理的LeetCode_数组_中等题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode_树类
- 下一篇: Java四种输出语句