zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    数据库中的float在实体中对应的竟是double
    VS2010让开发者受益新功能深入解读
    .net 缩略图 高品质
    不错.net图片水印类
    [转] asp.net url重写
    进制转换方法汇总
    c#中如何TextBox中輸入的換行符存入access數據庫
    .net高品质缩略图和低品质缩略图
    SQL Server中获得EXEC后面的sql语句或者存储过程的返
    C#动态创建图像的方法
  • 原文地址:https://www.cnblogs.com/immiao0319/p/8041808.html
Copyright © 2011-2022 走看看