java简单算法:移除元素

问题

  • 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
    不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
    元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

解决

class Solution {
    public int removeElement(int[] nums, int val) {
//遇到原地,则可以使用一个指针将其锁定
// 设置左右双指针,左指针指向保留元素,当遇到指定元素的时候,左指针不动,
// 右指针将下一位不是指定元素赋值给左指针,这样就完成了原地删除操作
    int n=nums.length;
    if(n==0) return 0;
    // int right=0,left=0;
    // while(right<n){
    //     if(nums[right]!=val){
    //         nums[left]=nums[right];
    //         ++left;
    //     }
    //  ++right;
    // }
    int left=0;
    for(int right=0;right<n;right++){
        if(nums[right]!=val) {
            nums[left]=nums[right];
            ++left;
        }
    }
    return left;
    }
}
// 双指针优化
class Solution{
    public int removeElement(int[] nums,int val){
        if(nums.length==0) return 0;
        int left=0,right=nums.length;
        while(left<right){
            if(nums[left]==val){
                nums[left]=nums[right-1];
                --right;
            }else{
                ++left;
            }
        }
        return left;
    }
}

总结

  • 其中双指针优化:将利用两个指针从左右分别开始遍历,因为题目不考虑元素顺序和长度,因此可以用后面的元素替换掉指定元素,这样就不用每个元素都要移位。
  • 在我使用双指针优化的时候,想到,如果仅仅是将右边元素赋值给左边元素,会不会造成元素重复(就是同一个值出现两次)问题?并不会,因为当left遇到val时,right-1将自身
    的值赋给了left,并且right将向左移一位。
posted @   new_monkey  阅读(292)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示