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