• [ ] 27.移除元素 :::info 前提:

    • 有序数组

    • 无重复元素 ::: 代码:(详细注释)

      1. // 暴力解法,双循环
      2. //时间复杂度:O(n^2)
      3. // 空间复杂度:O(1)
      4. class Solution {
      5. public:
      6. int removeElement(v ector<int>& nums, int val) {
      7. int size = nums.size();
      8. for (int i = 0; i < size; i++) {
      9. if (nums[i] == val) { // 发现需要移除的元素,就将数组集体向前移动一位
      10. for (int j = i + 1; j < size; j++) {
      11. nums[j - 1] = nums[j];
      12. }
      13. i--; // 因为下表i以后的数值都向前移动了一位,所以i也向前移动一位
      14. size--; // 此时数组的大小-1
      15. }
      16. }
      17. return size;
      18. }
      19. };

      ```cpp //双指针法 //时间复杂度:$O(n)$ //空间复杂度:$O(1)$ class Solution { public: int removeElement(vector& nums, int val) {

      1. int slowIndex = 0;
      2. for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++)
      3. {
      4. //如果没有遇到val,则快慢指针重叠,否则慢指针等待快指针跳过val区域,再给它赋值
      5. if (val!=nums[fastIndex])
      6. nums[slowIndex++] = nums[fastIndex];
      7. }
      8. return slowIndex;
      9. }

      };

    ``` 分析:
    快慢指针,就是用一个慢指针等待快指针。