美文网首页
two-Sum及其引申相关

two-Sum及其引申相关

作者: Zake_Wang | 来源:发表于2017-09-06 09:44 被阅读0次

[twoSum]https://leetcode.com/problems/two-sum/description/

1.暴力解法
两摞扑克牌,分别遍历,从第一摞牌中拿出一个,然后从第二摞牌中依次拿出扑克牌进行求和,等于target就满足条件return

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] result =  new int[2];
        if (nums.length < 2) {
            return result;
        }
        for (int i = 0; i < nums.length - 1; i++) {
            for (int j = i+1; j < nums.length; j++) {
                if (nums[i] + nums[j] == target) {
                    result[0] = i;
                    result[1] = j;
                    return result;
                }
            } 
        }
        return result;
    }
}

2.暴力解法的时间复杂度为O(n^2),优化一下,由于题目要求输出索引,想到hashmap

//循环从0到n-1,遍历到第i个元素的时候,前i个都插入到了hashmap
//先看看在hash里nums[i]是否存在,如果存在,就把索引压进去
//如果等于空就再把剩下的target-i放进hash里,重复同样的步骤

class Solution {
    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer,Integer> map = new HashMap<>();

        for (int i = 0; i < nums.length; i++) {
            if (map.get(nums[i]) != null) {
                int[] result = {map.get(nums[i]) , i};
                return result;
            }
            map.put(target - nums[i], i);
        }
        
        int[] result = {};
        return result;
    }
}

3.不要求输出索引,而是要求输出数组的twoSum,前后指针

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int[] result = new int[2];
        Arrays.sort(numbers);
        int first = 0, second = numbers.length-1;
        while (first < second) {
            if (numbers[first] + numbers[second] == target) {
                result[0] = numbers[first];
                result[1] = numbers[second];
                return result;
            }
            if (numbers[first] + numbers[second] > target) {
                second--;
            }
            if (numbers[first] + numbers[second] < target) {
                first++;
            }
        }
        return result;
    }
}

3Sum
[3Sum] https://leetcode.com/problems/3sum/description/
这道题的思路也是双指针,注意使用双指针的时候一定要对数组排序。本题给的List,就要使用ArrayList把原数组的结果存入,同时在调用2Sum函数时候要注意再使用ArrayList存输出的数组,最后并入之前的结果中。

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();
        if (nums == null || nums.length < 3) {
            return result;//边界判断
        }
        Arrays.sort(nums);
        
        for (int i = 0; i < nums.length - 2; i++) {
            //去重
            if (i > 0 && nums[i] == nums[i - 1]) {
                continue;
            }
            int first = i + 1, second = nums.length-1;
            int target = -nums[i];
            twoSum(nums,first,second,target,result);
        }
        return result;
    } 
    public void twoSum(int[] nums, int first, int second, int target, List<List<Integer>> result) {
        while (first < second) {
            if (nums[first] + nums[second] == target) {
                ArrayList<Integer> triple = new ArrayList<>();
                triple.add(-target);//因为定义的就是target,所以此处不能用nums[i],传不进来
                triple.add(nums[first]);
                triple.add(nums[second]);
                result.add(triple);
                first++;
                second--;
                //去重
                while (first < second && nums[first] == nums[first - 1]) {
                    first++;
                }
                while (first < second && nums[second] == nums[second + 1]) {
                    second--;
                }
            } else if (nums[first] + nums[second] < target) {
                first++;
            } else {
                second--;
            }
        }
    }
}

相关文章

  • two-Sum及其引申相关

    [twoSum]https://leetcode.com/problems/two-sum/description...

  • jQuery源码的简单理解及其引申的相关问题的解答

    1.jQuery运用了沙箱模型,使用闭包来隔离变量,制造出块级作用域,防止全局变量污染。 2.jQuery在闭包内...

  • 使用vscode的markdown插件绘图写文档

    使用Markdown 语法绘制相关的流程图以及其他相关的图 使用Markdown 语法绘制相关的流程图以及其他相关...

  • two-sum

  • 知识储备,想象力,资源的挖掘与整合

    1、拔高深挖引申法 深挖,透过现象看本质 拔高,将文章立意升华到一个高度 引申到其他相关内容 提问、引人深思 读者...

  • 第36天:思维能力的锻炼

    1.深挖(通过现象看本质)→2.拔高(升华)→3.引申(引申到其他相关内容)→4.提问,引人深思→5.读者思考与自...

  • 尊重孩子,不只是口头上的承诺

    尊重,是一个褒义的词,“古语是指将对方视为比自己地位高而必须重视的心态及其言行,现在已逐渐引申为平等相待的心态及其...

  • 引申

    引申 跨过时空 远离远方 天女散花的诗篇 走着走着诗就散了 像是太阳一样的光芒 撞上南墙 越过雷池 煮一锅水饺 像...

  • 引申

    杨胜晓 夏天的热浪难耐,冬天的寒冷刺骨。人生也一样,苦是人生的常态。人生时时刻刻都需要进行修行,而其中很重要的一点...

  • Android中Button和动画

    目的 掌握按钮的相关属性及其操作,熟悉xml配制动画和代码创建和图片的 相关技术、及其使用 1、Button的属性...

网友评论

      本文标题:two-Sum及其引申相关

      本文链接:https://www.haomeiwen.com/subject/qzdmjxtx.html