leetcode27:Remove Element

Remove Element

Given an array and a value, remove all instances of that value in place and return the new length.

Do not allocate extra space for another array, you must do this in place with constant memory.

The order of elements can be changed. It doesn't matter what you leave beyond the new length.

Example:
Given input array nums = [3,2,2,3], val = 3

Your function should return length = 2, with the first two elements of nums being 2.

这个题有三个提示:

Hint:

  1. Try two pointers.
  2. Did you use the property of "the order of elements can be changed"?
  3. What happens when the elements to remove are rare?
刚开始的时候没有看这个提示,用的方法是类似于26题那样,只要发现于val相同的元素,直接将后面的元素依次往前移动

//时间复杂度是O(n2)
	public int removeElement(int[] nums,int val){
		
		int deleteNumber = 0;
		for(int i = 0;i < nums.length - deleteNumber;i++){
			
			if(val == nums[i]){
				deleteNumber++;
				for(int j = i;j < nums.length - deleteNumber;j++){
					nums[j] = nums[j+1];
				}
				i = i - 1;//这个题与26题去重不一样,此题是去除与val相同的数,所以删除重复数以后,i的值不变,接着判断i位置的新值
			}
		}
		return nums.length - deleteNumber;
	}

后面看了一下提示,对代码作了优化使得时间复杂度变为O(n),使用两个指针当从头遍历发现与val相等的元素时,用最后一个元素替换前面的元素,两个指针相应修改位置

	//循环一次
	public int removeElement2(int[] nums,int val){
		
		int deleteNumber = 0;
		for(int i = 0;i < nums.length - deleteNumber;i++){
			
			if(nums[i] == val){
				deleteNumber++;
				nums[i] = nums[nums.length - deleteNumber];
				i = i - 1;//当使用排序好的数组时,不需要加这一行
			}
		}
		return nums.length - deleteNumber;
	}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值