[LeetCode]Two Sum

来源:互联网 发布:网络机顶盒有哪些牌子 编辑:程序博客网 时间:2024/06/05 19:11
题意:求出某个数组中的两个数值的和等于一个固定的target的该两个数值的下标,按从小到大的顺序.
解题思路:
1: 直接暴力遍历 复杂度O(n*n) 超时
2:先排序,再遍历 增加了空间复杂度,时间复杂度为O(N+N*log(N)+N)
3:有人建议用HashMap但是如果有重复数据就应该是不成立的,思路二的解法如下:

    public int[] twoSum(int[] numbers, int target) { <span style="white-space:pre"></span>assert (numbers == null || numbers.length < 2);        class node {//辅助类            int index;            int value;            public node(int index, int value){ this.index = index; this.value = value; };        }        int[] rs = { 0, 0 };        List<node> nodes = new ArrayList<node>();        for (int index = 0 ;index< numbers.length; ++index){            nodes.add(new node(index+1, numbers[index]));//index 从1开始        }        Collections.sort(nodes, new Comparator<node>() {//排序            @Override            public int compare(node o1, node o2) {                return o1.value - o2.value;            }        });        int i = 0, j = nodes.size()-1;        while (i<j){            int v1 = nodes.get(i).value;            int v2 = nodes.get(j).value;            if(v1 + v2 > target){                j --;                continue;            }            if(v1 + v2 == target){                rs[0] = Math.min(nodes.get(i).index, nodes.get(j).index);                rs[1] = Math.max(nodes.get(i).index, nodes.get(j).index);                return rs;            }            if(v1 + v2 < target){                i ++;                continue;            }        }        return rs;    }


0 0
原创粉丝点击