27. 移除元素的简单思路与26删除数组的重复项的简单思路

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;
    }
};

总结:

因为相似,将两个题目放在一起看,或许这两个题目有不同的更简便的方法,但可能因为我自身对策局限性和各种各样的原因,这两个题目暂且这样完成。

方法:不需要考虑数组越界的情况会降低难度,我也尝试了一下数组不越界的时候,但是会超出该题的时间限制,或许我的代码简化还不够好,但总的来说我觉得如果考虑新长度后面的元素,难度应该会更大些。

猜你喜欢

转载自blog.csdn.net/thunderforrain/article/details/81153503