Stay Hungry,Stay Foolish!

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

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

 
 https://leetcode.cn/problems/remove-duplicates-from-sorted-array-ii/description/?envType=study-plan-v2&envId=top-interview-150
 

思路

left指向第一个字符,

right指向第二个字符, 做值相等性判断,

如果right指向字符跟left相等,则需要另外一个指针right_end, 去寻找right后,第一个值不等于left,

  left+1位置复制left位置的值  

  left+2 位置复制right_end位置的值,

  left 赋值为 left+2

  right 赋值为 right_end+1

否则,

  left+1 位置复制right值
  left 赋值为 left+1
  right 赋值为 right+1

Code

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int nums_len = nums.size();

        if (nums_len <= 2) return nums_len;

        int left = 0;
        int right = 1;

        while(left < right && right < nums_len){
            // cout << "left=" << left << ", right=" << right << endl;

            if (nums[left] == nums[right]){
                /*
                0       0 0 0 0 0 1 1 2 2
                !       !         !  
                left    right     right_end
                */
                int right_end = right + 1;
                if (right_end >= nums_len){
                    nums[++left] = nums[right];
                    break;
                }

                // cout << "out right_end=" << right_end;

                while(right_end < nums_len){
                    // cout << "out right_end=" << right_end;

                    if(nums[right_end] == nums[right]){
                        right_end++;
                        if (right_end >= nums_len){
                            nums[++left] = nums[right];
                            right = right_end;
                            break;
                        }
                    } else {
                        nums[++left] = nums[right];
                        nums[++left] = nums[right_end];
                        right = right_end+1;
                        break;
                    }
                }
            } else {
                /*
                0       0 0 0 0 0 1 2 2 2
                !       !         !  
                left    right     right_end

                -> after if branch -> 

                0       0 1 0 0 0 1 2 2 2
                          !         !   
                          left      right

                */
                nums[++left] = nums[right];
                right++;
            }
        }

        return left+1;
    }
};

 

 
 
posted @ 2024-03-02 23:57  lightsong  阅读(1)  评论(0编辑  收藏  举报
Life Is Short, We Need Ship To Travel