力扣LeetCode27:移除元素

题目:

        给你一个数组nums和一个数值val,你需要 原地 移除所有数值等于val的元素,并返回移除后数组的新长度。要求:空间复杂度为O(1)

方法1:暴力破解法(时间复杂度为O(n2)) 

        思路:从数组下标为0开始找nums[i]==val,当找到与之匹配的第一个数组元素时“删除”这个元素,那我们如何删除呢?用这个元素后面的元素去覆盖这个元素(用每个元素的后继去覆盖掉本身) nums[i]==nums[i+1] 。

        例如:nums[4]=[2,2,3,3]  val=2   用以上去循环一遍就数组就变成[2,3,3,3]。只要我们元素满足条件就从头开始循环遍历。再次遍历之后就变成[3,3,3,3]。因为我们每次遍历要‘删除’,后面一个元素覆盖前一个元素以此类推,倒数第一个元素总是与倒数第二个元素相同,所有我们可以'删除'该元素(让数组长度减一)上面的例子:第一次遍历就变成了[2,3,3] 第二次遍历就变成[3,3]。

至于我们如何算被删除后数组的长度,可以用原数组的长度减去每次匹配(nums[i]==val)的次数 。

核心代码:

	for (int i = 0; i < length;) {  //length数组的长度 
			if (nums[i] == val) {
				if (nums[length - 1] == val) { //当最后val 是数组中最后一个数时 
					length -= 1;
				} else {
					for (int j = i; j < length - 1; j++) {
						//TODO
						nums[j] = nums[j + 1];
						
					}
					length-=1;
				}
				k++;
			}else{
				i++;
			}
		
	}
 方法二:快慢指针(时间复杂度为O(n))

        快指针指向当前要和val对比的元, 慢指针指向将被赋值的位置

  • 最初快慢指针都指向nums[0]的位置 即fast=slow=0
  • 当nums[fast]!=val时 nums[slow] = nums [fast] 快慢指针一起向下移动一位
  • 当nums[fast]==val时 慢指针不动,快指针向下移动一位

最后slow的值就是最后数组的长度

public class test1 {
    public int removeElement(int[] nums,int val){
        //定义快慢指针
        int fast=0;
        int slow=0;

        for(;fast<nums.length;fast++){
            if(nums[fast]!=val){
                nums[slow]=nums[fast];
                slow++;
            }
        }
        return  slow;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值