力扣刷题笔记5:双指针题目

  题目1.移动0

 

 

 解题思路: (1)这里使用双指针方法,定义left=right=0,然后判断nums[right]是否为0,如果是则right++;如果不是则left++,right++,nums[left]

                    (2)一直执行(1)操作,直到right=nums.size()跳出循环

                    (3最后将left到right之间的元素都置为0(因为right-left就是0元素的个数)

 

具体代码如下:

 

 

 

题目2:删除数组元素中的重复项

 

 

 解题思路:(1)这道题的标签是双指针,但是我觉得没有必要,直接用了vector中自带的erase函数,首先定义auto a=nums.begin();

                  (2)判断*a是否等于*(a+1),如果是a=erase(a).否则,a++,直到a=nums,end()

具体代码如下:

 

 

注意:使用erase函数后,返回值是指向删除元素(或范围)的下一个元素的迭代器。

 

题目3:删除链表的倒数第n个节点

 

 

 解题思路:(1)这也是一道典型的双指针题目,首先定义left=right=head;

                    (2)让right行进n步

                    (3)让left和right同时前进,直到right==null;,这时left所指向的下一个节点就是要被删除的结点

                    (4)令left->next=left->next->next,返回head

 

具体代码如下:

 

 

 

题目4:反转链表

 

 

 解题思路如下:(1)定义一个指针p,指向尾结点;

                          (2)从首结点开始,依次取出该结点并嵌入p结点之后

                          (3)一直执行(2),直到该节点指向p;

具体代码如下:

 

题目5.环形链表||

 

 

 解题思路:1.定义一个快指针fast和慢指针slow,快指针每次走两步,慢指针每次走一步;

                   2.情况一,快指针指向了null,证明无环,返回null;

                   3.情况二,快慢指针相遇,证明有环,头结点和入环结点长度为l,环的长度为s,快结点走过的长度为g,慢结点走过的长度为f;

                 (1)因为g=2f,g=f+ns,所以f=ns;

                 (2) 因为从头结点开始走l+ns(n=0,1,2,3...)肯定能走到入环结点,又因为此时f=ns,所以定义一个指针指向头结点,是该指针和慢指针按相同速度前进,相遇的点即为入环节点

代码如下:

 

 

 

 题目6.三数之和

 

 

 

 

 

 

 

 

 解题思路:

 1.特判,对于数组长度 n,如果数组为 null 或者数组长度小于 3,返回 。

 2.对数组进行排序。

 3.遍历排序后数组:
 (1)若 nums[i]>0:因为已经排序好,所以后面不可能有三个数加和等于 0,直接返回结果。
 (2)对于重复元素:跳过,避免出现重复解
 (3)令左指针 L=i+1,右指针 R=n-1,当 L<R 时,执行循环: 
 (4)当 nums[i]+nums[L]+nums[R]==0,执行循环,判断左界和右界是否和下一位置重复,去除重复解。并同时将 L,R移到下一位置,寻找新的解
 (5)若和大于 0,说明 nums[R] 太大,R 左移
 (6)若和小于 0,说明 nums[L]太小,L 右移

 

代码如下:

 

 

 

 题目7.四数之和

 

解题思路:这道题和上一题非常类似,只需再加一层循环即可,这里就不多叙述了,直接放代码

代码如下

 

 

posted @ 2020-12-05 21:00  伞兵1号  阅读(100)  评论(0)    收藏  举报