3sum, 3sum closest

[抄题]:

Given an array S of n integers, are there elements abc in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

[思维问题]:

[一句话思路]:

化成和为0 - nums[i]的两根指针2sum

[输入量特别大怎么办]:

[画图]:

[一刷]:

  1. 记得第一步就写排序
  2. corner case反正都是空的,直接return res自己就行。
  3. 防止重复判断时必须要写(i > 0 && nums[i] != nums[i - 1]),因为i - 1最后一位是0。
  4. 下次不要定义value了,因为value随指针的改变而不断变化。
  5.  List<List<Integer>> res = new ArrayList<List<Integer>>(); 只有最右边是空的。
  6. 循环条件是for (int i = 0; i < nums.length; i++),上界还是i < nums.length

[总结]:

不要定义value

记得先排序

[复杂度]:

[英文数据结构,为什么不用别的数据结构]:

用linkedlist: 3sum的元素个数不确定,需要动态添加

[其他解法]:

[题目变变变]:

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> res = new LinkedList<>();
        
        if (nums == null || nums.length < 3) {
            return res;
        }
        
        Arrays.sort(nums);//!!!
        
        for (int i = 0; i < nums.length; i++) {
            int left = i + 1;
            int right = nums.length - 1;
            int sum = 0 - nums[i];
            
        if (i == 0 || (i > 0 && nums[i] != nums[i - 1])) {
            while(left < right) {
                if (nums[left] + nums[right] == sum) {
                    res.add(Arrays.asList(nums[i],nums[left],nums[right]));
                    while(left < right && nums[left] == nums[left + 1]) {
                        left++;
                    }
                    while(left < right && nums[right] == nums[right - 1]) {
                        right--;
                    }
                    left++;
                    right--;
                }
                else if (nums[left] + nums[right] < sum) {
                    left++;
                }
                else {
                    right--;
                }
            }
        }
        } 
        return res;
    }
}
View Code

 

3sum closest

[抄题]:

Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.

For example, given array S = {-1 2 1 -4}, and target = 1.
The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).

[思维问题]:

用diff做要判断两边,很麻烦。

[一句话思路]:

用abs绝对值函数,直接就两边比较大小。

[输入量特别大怎么办]:

[画图]:

[一刷]:

用了指针的变量,要放在发生指针变化的循环体之内

[总结]:

注意用了指针的变量

[复杂度]:

[英文数据结构,为什么不用别的数据结构]:

[其他解法]:

[Follow Up]:

[题目变变变]:

2sum closest 4...

class Solution {
    public int threeSumClosest(int[] nums, int target) {
        if (nums.length < 3 || nums == null) {
            return -1;
        }
        
        Arrays.sort(nums);
        int bestSum = nums[0] + nums[1] + nums[2];
        for(int i = 0; i < nums.length; i++) {
            int left = i + 1;
            int right = nums.length - 1;
            
            while (left < right) {
                int sum = nums[i] + nums[left] + nums[right];
                if (Math.abs(sum - target) < Math.abs(bestSum - target)) {
                bestSum = sum;
            }
                
                if (sum == target) {
                    while(left < right && nums[left] == nums[left + 1]) {
                        left++;
                    }
                    while(left < right && nums[right] == nums[right - 1]) {
                        right--;
                    }
                    left++;
                    right--;
                }
                else if (sum < target) {
                    left++;
                }
                else {
                    right--;
                }
            }
        }
        return bestSum;
    }
}
View Code

 

posted @ 2017-12-15 10:40  苗妙苗  阅读(159)  评论(0编辑  收藏  举报