leetcode algorithm-08
24 Jun 2020
|
|
本文主要对数组题进行分析和整理,数组题采用双指针比较多,本文也有一道通过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;
}
};
数组重复数字
思路:该类题特征比较明显,就是长度为n的数组所有数字范围都在0~n-1范围内,就是数组元素可以作为index。这里需要保证nums[i]=i,否则需要swap,但swap时需要先判定swap的两个元素是否相同。
数组丢失元素的swap方法
思路:在数组题中,可能需要二级结论让题变得简单。
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