雙指針算法專題(三)之求和問題

1.

給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。

你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個數組中同樣的元素。

示例:

給定 nums = [2, 7, 11, 15], target = 9

因爲 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
class Solution {
    public int[] twoSum(int[] nums, int target) {
        int []ans=new int[2];
        Map<Integer,Integer>mp=new HashMap<>();
        for(int i=0;i<nums.length;i++){
            mp.put(nums[i],i);
        }

        for(int i=0;i<nums.length;i++){
            int k=target-nums[i];
            if(mp.containsKey(k)&&i!=mp.get(k)){
                ans[0]=i;
                ans[1]=mp.get(k);
                break;
            }
        }
        return ans;
 
    }
}

2.

給定一個已按照升序排列 的有序數組,找到兩個數使得它們相加之和等於目標數。

函數應該返回這兩個下標值 index1 和 index2,其中 index1 必須小於 index2

說明:

  • 返回的下標值(index1 和 index2)不是從零開始的。
  • 你可以假設每個輸入只對應唯一的答案,而且你不可以重複使用相同的元素。

示例:

輸入: numbers = [2, 7, 11, 15], target = 9
輸出: [1,2]
解釋: 2 與 7 之和等於目標數 9 。因此 index1 = 1, index2 = 2 。
class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int len=numbers.length;
        int i=0;
        int j=len-1;
        int []ans=new int[2];
        Arrays.sort(numbers);
        while(i<j){
            if(numbers[i]+numbers[j]==target){
                ans[0]=i+1;
                ans[1]=j+1;
                break;
            }
            else if(numbers[i]+numbers[j]>target){
                j--;
            }
            else{
                i++;
            }
        }
        return ans;
    }
}

3.

給定一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。

注意:答案中不可以包含重複的三元組。

例如, 給定數組 nums = [-1, 0, 1, 2, -1, -4],

滿足要求的三元組集合爲:
[
  [-1, 0, 1],
  [-1, -1, 2]
]
//將nums[l]+nums[r]+nums[i]=0
//轉化爲 nums[l]+nums[r]=-nums[i] 即轉化爲2數求和問題
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>>ls=new ArrayList<>();
        for(int i=0;i<nums.length-2;i++){
            if(i==0||(i>0&&nums[i]!=nums[i-1])){
                int l=i+1,r=nums.length-1,sum=0-nums[i];
                while(l<r){
                    if(nums[l]+nums[r]==sum){
                        ls.add(Arrays.asList(nums[i],nums[l],nums[r]));
                        while(l<r&&nums[l]==nums[l+1])l++;
                        while(l<r&&nums[r]==nums[r-1])r--;
                        l++;
                        r--;
                        
                    }
                    else if(nums[l]+nums[r]<sum){
                        l++;
                    }
                    else{
                        r--;
                    }
                }
            }
            
        }
        return ls;
    }
}

4.最接近的三數之和

給定一個包括 n 個整數的數組 nums 和 一個目標值 target。找出 nums 中的三個整數,使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在唯一答案。

例如,給定數組 nums = [-1,2,1,-4], 和 target = 1.

與 target 最接近的三個數的和爲 2. (-1 + 2 + 1 = 2).
class Solution {
    public int threeSumClosest(int[] nums, int target) {
        Arrays.sort(nums);
        int len=nums.length;
        int i;
        int ans=nums[0]+nums[1]+nums[2];
        for(i=0;i<len-2;i++){
            int l=i+1;
            int r=len-1;
            while(l<r){
                int sum=nums[l]+nums[r]+nums[i];
                if(Math.abs(sum-target)<Math.abs(ans-target)){
                    ans=sum;
                
                }
                if(sum>target)
                    r--;
                else if(sum<target)
                    l++;
                else
                    return target;
            }
        }
        return ans;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章