zoukankan      html  css  js  c++  java
  • 167. 两数之和 II

    本题在两数之和的基础上又增加了数组递增的属性,因此我们除了利用哈希映射外

    又多了一种方法,那就是二分查找。

    针对每一个数组元素,做二分查找,查找的目标即为target-numbers[i]

    本题需要注意的点有2个,

    (1)不能使用相同元素,即查找的low需要是i+1

    (2)返回的数组下标是从1开始的

    时间O(nlogn)(二分查找的时间是logn,再加上外层循环就是nlogn),空间O(1)

        public int[] twoSum(int[] numbers, int target) {
            for (int i=0;i<numbers.length;i++){
                // 二分查找的范围从i+1(不能使用相同元素,所以i不包括在内)到数组末尾
                int low=i+1,high=numbers.length-1;
                while(low<=high){
                    // 防止(high+low)溢出
                    int mid = (high-low)/2+low;
                    if (numbers[mid]==target-numbers[i]){
                        // 注意审题,返回值下标从1开始计数
                        return new int[]{i+1,mid+1};
                    }else if (numbers[mid]>target-numbers[i]){
                        high = mid-1;
                    }else{
                        low = mid+1;
                    }
                }
            }
            return new int[]{-1,-1};
        }
    争取早日不再是一只菜鸡
  • 相关阅读:
    Hamming Distance
    变量
    Jupyter Notebook 快捷键使用指南
    XPath使用总结
    selenium调用webdriver异常
    漏洞挖掘 | 远程WWW服务支持TRACE请求
    漏洞挖掘 | 点击劫持
    漏洞挖掘 | 目录浏览漏洞
    漏洞挖掘 | 弱口令漏洞
    浅谈Linux下/etc/passwd文件
  • 原文地址:https://www.cnblogs.com/jchen104/p/14651561.html
Copyright © 2011-2022 走看看