面试经典 150 题——2

1、题目介绍

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

2、我的思路及代码

class Solution {
    public int removeElement(int[] nums, int val) {
            /** 
                1、先设定两个标志位i与j,
                i是从前往后找,查找到下一个等于val的数组值的下标,
                j是从后往前找,查找到下一个不等于val的数组值的下标。类似于快速排序查找。
                2、之后循环将nums[i] = nums[j],直到不满足i <= j 这个条件时候停止查找并替换。
                3、时间复杂度O(n),空间复杂度O(1)。
            */
            int i = 0, j = nums.length - 1, k = 0, n = nums.length;
            while( i < j ){
                while( i < n && nums[i] != val){
                    i++;
                }

                while( j > 0 && nums[j] == val){
                    j--;
                }
                if( i < j ){
                    k++;
                    nums[i++] = nums[j--];
                }
            }
            while(i < n){
                if(nums[i] == val){
                    k++;
                }
                i++;
            }
            return n - k;
    }
}

3、官方题解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、结论

  • 我的思路主要和第二种方法相似,但是优化程度不足。
  • 我忽略了第一种方法初始地方的快慢双指针方法。
  • 缺少对第二种方法的优化,有些步骤重复走了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值