当前位置:   article > 正文

力扣刷题1day--数组操作单指针,快慢指针

力扣刷题1day--数组操作单指针,快慢指针

1、单指针

毋庸置疑只有一个指针!!!

27. 移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素

示例 1:

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。

示例 2:

输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,3,0,4]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

思路:遍历数组找到需要被删除的元素,然后后位补齐,得到新的数组及新数组的长度;

(这个时候肯定会有小伙伴想把那个直接删掉不就好了吗???但是肯定和我当时最开始一样没有注意到数组中地址连续,不能单独删除某个元素,只能覆盖。。。。。)所以这样是行不通的,所以要另辟捷径。

题解开始:

话不多说,可以使用一个指针指向新数组的位置,遍历原数组,将不等于val的元素放入新数组,并且在放入一个新元素指针就后移一位,最后修改新数组的大小

代码如下:

  1. #pragma once
  2. #include <vector>
  3. #include<algorithm>
  4. using namespace std;
  5. class Solution1
  6. {
  7. public:
  8. int removeElement(vector<int>& nums, int val)
  9. {
  10. int size=nums.size();
  11. int flag=0;
  12. for(int i=0;i<size;i++)
  13. {
  14. if(nums[i]!=val)
  15. {
  16. nums[flag]=nums[i];
  17. flag++;
  18. }
  19. }
  20. nums.resize(flag);
  21. return nums.size();
  22. }
  23. };

2、快、慢指针

但是一开始我在想怎么指针还能一快一慢,这又不是赛跑,还能这样玩???

但是事实就是真的可以这样玩,它还就真的可以赛跑一样;下面和我一起看看它是怎么跑的吧!!!

26. 删除有序数组中的重复项

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

  • 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
  • 返回 k 。

示例 1:

输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 不需要考虑数组中超出新长度后面的元素。

示例 2:

输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。s

思路:遍历去重,留下唯一,返回新数组长度

(是不是感觉很简单,distinct一下不就好了吗???,停停停,走错片场了!!!小拳拳警告哦,数据库可以这样,但是这里不行哦)

废话不说,上题解:

安排两个指针(一个兔子(fast),一个乌龟(slow)),比赛开始,兔子直接从1出发,乌龟从0,出发,然后兔子等于乌龟的值,兔子向前跑,乌龟不动,当兔子值与乌龟不同时候乌龟感觉到危机,向前挪动一步,然后以此类推,一直向下,找出所有值,并且每个值只拿出一次,给乌龟。此时乌龟有了整个数组里的所有不同的值,并且每个值独一无二,兔子则是跑完整个数组探路。

代码如下:

  1. #pragma once
  2. #include<vector>
  3. #include<iostream>
  4. using namespace std;
  5. class Solution2
  6. {
  7. public:
  8. int removeDuplicates(vector<int>& nums) {
  9. int size=nums.size();
  10. int fast=1,slow=0;
  11. if(size==0)
  12. {
  13. return 0;
  14. }
  15. for(fast=1;fast<size;fast++)
  16. {
  17. if(nums[fast]!=nums[slow])
  18. {
  19. nums[slow+1]=nums[fast];
  20. slow++;
  21. }
  22. }
  23. return slow;
  24. }
  25. };

要有不对地方还请多多包含,欢迎各位大佬及时指正,我也刚刚开始接触算法没几天,需要学习的还很多~~~~

今日总结到此结束~~~~拜拜咯~~~~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/860546
推荐阅读
相关标签
  

闽ICP备14008679号