• 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
  • 相关阅读:
    Android AlertDialog警告对话框实现
    Android状态栏通知Status Bar Notification
    Android spinner控件的实现
    Winform之UI后台线程
    Winform之自定义控件
    WebForm原理,aspx服务器端与客户端源码比较
    IHttpModule之闲扯
    [算法]方正面试题:N×N矩阵螺旋打印输出
    DOTA版设计模式——工厂方法
    Window服务
  • 原文地址:https://www.cnblogs.com/immiao0319/p/8041808.html
Copyright © 2020-2023  润新知