27原题链接:https://leetcode-cn.com/problems/remove-element/description/
26原题链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/description/
27题目描述:
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
26题目描述:
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
分析:需要把握的点在原地修改元素和数组的长度,降低难度的点是不需要考虑新长度后面的元素。、
思路:
使用 O(1) 额外空间的条件下完成,则最好利用循环语句从数组顶部往数组底部靠拢,这样更容易来确定数组的长度,另外还需设置多余的变量来确定删除的元素个数,我这里用k来确定删除的个数。如下:
第一个和第二个循环语句:
for(int i=nums.size()-1;i>=0;i--)
for(int j=i;j<nums.size()-k;j++)
27判断数组中与寻找的变量相同,则k加一:
if(nums[i]==val) {
k++;
26判断重复项,则k加一:
if(nums[i]==nums[i-1]){
k++;
27源代码如下:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int k=0;
for(int i=nums.size()-1;i>=0;i--){
if(nums[i]==val) {
k++;
for(int j=i;j<nums.size()-k;j++){
nums[j]=nums[j+1];
}
}
}
return nums.size()-k;
}
};
26源代码如下:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int k=0;
for(int i=nums.size()-1;i>0;i--){
if(nums[i]==nums[i-1]){
k++;
for(int j=i;j<=nums.size()-k;j++){
nums[j-1]=nums[j];
}
}
}
return nums.size()-k;
}
};
总结:
因为相似,将两个题目放在一起看,或许这两个题目有不同的更简便的方法,但可能因为我自身对策局限性和各种各样的原因,这两个题目暂且这样完成。
方法:不需要考虑数组越界的情况会降低难度,我也尝试了一下数组不越界的时候,但是会超出该题的时间限制,或许我的代码简化还不够好,但总的来说我觉得如果考虑新长度后面的元素,难度应该会更大些。