本文主要对数组题进行分析和整理,数组题采用双指针比较多,本文也有一道通过swap来判定丢失元素的例题,挺有意思。

双指针

题1:Remove Duplicates from Sorted Array II

思路:利用双指针,需要判断一下该元素是否与两个位置之前的数组元素是否相等,如果不相等,则需要赋到对应的指针所在的位置。这其实就意味着,slow指向的元素肯定会被赋值,而要判断fast指向的元素是否有用。

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int n = nums.size();
        if (n <= 2) {
            return n;
        }
        int slow = 2, fast = 2;
        while (fast < n) {
            if (nums[slow - 2] != nums[fast]) {
                nums[slow] = nums[fast];
                ++slow;
            }
            ++fast;
        }
        return slow;
    }
};

数组重复数字

题1:剑指 Offer 03. 数组中重复的数字

思路:该类题特征比较明显,就是长度为n的数组所有数字范围都在0~n-1范围内,就是数组元素可以作为index。这里需要保证nums[i]=i,否则需要swap,但swap时需要先判定swap的两个元素是否相同。

数组丢失元素的swap方法

题1:First Missing Positive

思路:在数组题中,可能需要二级结论让题变得简单。

class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        l = len(nums)
        for i in range(l):
            # 为了避免无限循环,有两个限制条件:
            # (1)当元素没法利用的时候需要停止. 
            # (2)当元素正好的定位到当前位置,即元素和它要对应的元素位置正好是相等的。
            while 0 < nums[i] <= l and nums[i] != nums[nums[i]-1]:
                temp = nums[i]
                nums[i], nums[temp-1] = nums[temp-1], nums[i]
        for key, val in enumerate(nums):
            if key + 1 != val:
                return key + 1
        return l + 1