leetcode-HOT100刷题 day3 双指针相关

## 双指针相关

### 283.移动零

#### 题目描述:

已解决

#### 思路:

双指针,前指针是位置指针,只是为了记录位置。

后指针只要一遇到非0,就搬到前面来,最后就是把全部的非0搬到前面来!

搬完非0,最后置0即可

### 11.盛最多水的容器

#### 题目描述:

已解决

#### 思路:

        说白了就是要中间这里面积最大嘛

        暴力的方法就是尝试所有的组合

        双指针的做法是,左右指针分别在端点,然后向内收缩

        每次移动短的那个边界,为什么呢,因为你移动长的那个,这个装水的区间还是由最短的边界决定的

        1.你就算移动到更长的,你还是没用,还是底小了高不变,所以你只能移动那个短的,才有可能让水装的多

        2.而且更重要的一点,为什么我们放弃了那个短的,不会错过正确答案,为什么那个短的不可能再作为边界了

        第二点的关键思路在于,把每一次的移动都看成一道单独的问题

        假设现在都在“两端” , 移动长的刚刚已经说过行不通,这就意味着

        假设短的那个端点不动,怎么移动都会变小  -> 这就能推出 短的这个端点一定不会成为更大容器的答案了!

        上面这一个推导是最重要的,这就说明,这个短的可以彻底放弃了,不会成为更好的答案,移动他,变成一个新的问题

        然后就是一直做新问题了相当于


 

### 15.三数之和

#### 题目描述:

已解决

#### 思路:

    问题:

        1. 因为输出三元组的顺序不重要,所以先排序,排序了我才能用双指针呀

        2. 因为不要重复答案,所需要去重

        So, 如何去重?三者大小顺序不变,所以每次都可以直接记录三个数吧,每次改变指针以后,我只要判断不和上一次重复

    解决方法:

        2.1 就一定不会有重复吧,原因就是我排序,因此只需要和上一次判断的不重复就行??

        但是这只能保证内层的双指针遍历不重复,外层i如果有两三个一样的,比如-2 -2 -2

        就会让两个重复解中间插入一个不重复的解

        打个比方,i在第一个-2的时候,这一轮双指针有两个答案,[-2,-2,4],[-2,0,2]

        然后i在第二个-2这一轮也会有[-2,-2,4],[-2,0,2],但是由于两个[-2,-2,4]之间有一个[-2,0,2]

        因此导致了刚刚的去重方法被破解了,所以确保和上一个答案不相等,只能去重内层

        2.2 外层如何去重??

        很简单,因为外层两个-2,第二个-2的那一组答案要么比第一个02要少,最多就和第一个02一样。

        所以只要保证,i和上一个i不相等就行,外层就可以去重了

    总结:

        有了顺序以后,我就可以考虑指针怎么设计,I遍历最小值,M和N就双指针,再剩下的区间内

        只要让你这个和等于 -I就行了,如果小了就M往右,如果大了就N往左,这样就可以让内部复杂度在O(n)

        总的复杂度就是O(n2)

        要从双指针内部去重,也要在双指针外部给每一个大组的答案去重。

#### 学到的点:

    1.不考虑顺序能排序的题,可以考虑双指针优化。

    2.Java中List的添加是用add(), 大小是用size(),而数组是length

你可能感兴趣的:(leetcode,算法)