• 双指针:167. 两数之和 II


     思路:
      原来未排序的两数之和,解法用HashMap是较好的。

    现在新加了一个排序过的特性,再联想起原来的两重for循环(顺序查找)

    立马想到的是第二重查找时使用二分查找,这样时间复杂度变为nlogn,空间复杂度为O1

    import java.util.Arrays;
    
    class Solution {
        public int[] twoSum(int[] numbers, int target) {
            for(int i=0;i<numbers.length;i++)
            {
                int j=Arrays.binarySearch(numbers,i+1,numbers.length,target-numbers[i]);//注意限定范围,否则可能会重复的出问题
                if(j>0)
                {
                    return new int[]{i+1,j+1};
                }
            }
            return null;
            
        }
    }

    这里因为二分法不是这里考察的重点,直接使用了自带的二分查找函数,另外这个数组部分查找原来是不知道的

    然而一看答案有点傻眼,是哦,这里用双指针法可以用On的时间复杂度解决

    直觉的想感觉可以理解,p1指头,p2指尾。比结果大则p2左移,比结果小则p1右移。

    但是是不是这样老觉得还是会漏掉一些情况,这时我们可以用我们喜闻乐见的格子穷举

    (缩减搜索空间)

     偏大则砍掉整一竖排(竖排大于等于顶点)

     偏小则砍掉整一横排(横排小于等于顶点)

     

    class Solution {
        public int[] twoSum(int[] numbers, int target) {
            int p1=0,p2=numbers.length-1;
            while(p1<p2)
            {
                if(numbers[p1]+numbers[p2]==target)
                {return new int[]{p1+1,p2+1};}
                else if(numbers[p1]+numbers[p2]>target)
                {
                    p2--;
                }
                else if(numbers[p1]+numbers[p2]<target)
                {
                    p1++;
                }
            }
            return null;
        }
    }
  • 相关阅读:
    学习笔记9
    学习笔记8
    学习笔记7
    学习笔记6
    学习笔记5
    学习笔记4
    学习笔记3
    学习笔记2
    学习笔记1
    矩形覆盖
  • 原文地址:https://www.cnblogs.com/take-it-easy/p/13811038.html
Copyright © 2020-2023  润新知