leetcode 26 27 80题解
这三道题的解法类似,学会其中一个,可以尝试独立解决另外两个。以下提供我的思路,并用C++和python实现。
leetcode 26
给定一个有序数组,使每个元素只出现一次,并返回新的长度,并在使用
必须在原地修改输入数组,不要申请额外的空间
解法
采用两个标记点 i和res,res记录不重复元素的位置,i从res的下一个开始遍历数组,如果i位置的数字等于res位置的数字,说明该数字重复出现,不予处理;如果i位置的数字不等于res位置的数字,说明该数字没有重复出现,需要放到res的下一个位置,并使res加1.
代码
C++
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int len = nums.size();
if(len<2)
return len;
int res = 1;
for(int i=1; i<len;i++){
if(nums[i]!=nums[res-1]){
nums[res++] = nums[i];
}
}
return res;
}
};
python
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
lenNums = len(nums)
if lenNums < 2:
return lenNums
res = 1
for i in range(1, lenNums):
if nums[i] != nums[res-1]:
nums[res] = nums[i]
res +=1
return res
leetcode 27
给定一个有序数组nums和一个值val,你需要在原地移除所有数值等于val的元素,返回移除后数组的新长度。
不需要额外的数组空间,你必须在原地修改输入数组并使用O(1)额外空间的条件下完成。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
解法
采用两个标记点 i和res,i和res的初始值等于0,i向后遍历,当nums[i]=val,让nums[res]=nums[i],并且res+1。
代码
C++
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int res =0;
for(int i =0; i<nums.size();i++){
if(nums[i]!=val){
nums[res++] = nums[i];
}
}
return res;
}
};
python
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
res = 0;
for i in range(len(nums)):
if nums[i]!=val:
nums[res] = nums[i]
res +=1
return res
leetcode 80
给定一个排序数组,你需要在原地删除重复出现的元素,使每个元素出现的次数不超过两次,返回移除后数组的新长度。
解法
解法和26题删除数组中重复元素大致相同,设置res位,但是这个需要和前面两位比较,由于数组有序,所以可以直接与当前位的前两位比,即nums[i]和nums[res-2]比较。
代码
C++
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int len = nums.size();
if(len<3) return len;
int res = 2;
for(int i=2;i<len;i++){
if(nums[i]!=nums[res-2])
nums[res++] = nums[i];
}
return res;
}
};
python
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
lenNums = len(nums);
if(lenNums < 3):
return lenNums
res = 2
for i in range(2, lenNums):
if nums[i] != nums[res-2]:
nums[res] = nums[i]
res += 1
return res