1.两数之和

image.png

最开始的想法是肯定不能查询一个数后在查所有后面的数,这样时间复杂度O(n2)。
如果先排序的再搜素,时间复杂度取决于排序的时间复杂度O(nlgn)。
肯定是利用hash原理扫一遍,再查。如果数组有重复的值,那么hash的value就直接用List。

public int[] twoSum(int[] nums, int target) {
        Map<Integer, List<Integer>> map = new HashMap<>(); //key:值 value:位置列表
        //hash
        for(int i=0;i<nums.length;i++){
            if(map.containsKey(nums[i])){
                map.get(nums[i]).add(i);
            }else {
                List list = new ArrayList();
                list.add(i);
                map.put(nums[i],list);
            }
        }
        for(int i=0;i<nums.length;i++){
            // 如果存在剩下的值
            if(map.containsKey(target-nums[i])){
                List<Integer> list = map.get(target - nums[i]);
                //待找值和减去的值相同,判断数组是否多余两个值
                if(target-nums[i]==nums[i]){
                    if(list.size()>=2){
                        return new int[]{list.get(0),list.get(1)};
                    }
                }else {
                    return new int[]{i,map.get(target-nums[i]).get(0)};
                }
            }else {
                continue;
            }
        }
        return new int[]{0,0};
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容