Leetcode——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.

我的思路:需要重新对数组的长度进行设置,并且数组的具体值也需要重新设置,而这部分需要新的数组长度来作中介。

于是,定义一个全局变量length来表示数组的新长度,同时初始化为0。要么最原始数组长度为0,那么就可以直接返回length;要么原始数组全部都为目标值,那么新的长度也为0.

 

先判断数组长度是否为0;

再来处理数组长度不为0时的情况。进入for循环(因为循环的次数已知)依次对数组中元素进行遍历。

若当前元素不等于目标数值,则遍历量加1,同时新长度也加1;

若当前元素等于目标值

先判断该元素是否为数组最后一个元素

若是,则直接返回length;

否则,初始化目标元素值的个数count= 0,进入求目标元素值个数的循环体while(因为不清楚具体循环次数)部分。先改变索引值为j,并且将i值赋值给j,每次确定索引j对应的元素值等于目标值,则count加1。直到j的元素值不再等于目标值,退出循环。

 

class Solution {

public int removeElement(int[] nums, int val) {

int length = 0;

if(nums.length == 0){

return 0;

}

else{

for(int i = 0;i < nums.length;){

if(nums[i]==val){

int count = 0;

if(i == nums.length - 1){

return length;

}

else{

int j = i;

while(j<nums.length && nums[j] == val){

count ++;

j = i + count;

}

i = j;

}

}

else{

nums[length++] = nums[i++];

}

}

}

return length;

}

}

 

 

优化1

思路:设置两个指针,一个i为慢指针,另一个j为快指针。

伪代码:

当nums[j]等于val时,跳过这个元素,并且j加1;

否则,将nums[j]赋值给nums[i],并且让i和j同时增加1;

重复执行,直到j到达数组的最后。

public int RemoveElement(int nums[],int val){

int i =0;

for(int j = 0;j<nums.length;j++){

if(nums[j]!=val){

nums[i]=nums[j];

i++;

j++;

}

}

return i;

}

优化2:

It doesn't matter what you leave beyond the new length.

主要的优化目的在于:当出现【1,2,3,4,5】而val=5时候的情况,或者说【5,1,2,3,4】val=5时,这种情况下上面的优化1仍然需要移动i次,而实际上如果只将数组动一个元素,比如改为4123,那么仍然也满足题目,并且移动次数大大减少。

伪代码:

一旦nums[j]等于val,则将数组的最后一个元素换到这个位置,同时将数组长度遍历的长度减1.

但是需要注意的是,有时候最后一个被换过来的元素等于val,这也没关系,在下一轮循环中会继续对这个元素做判断。

 

public int RemeveElement(int nums[],int val){

int n = nums.length;

int i=0

while(i<n){

if(nums[i]==val){

nums[i]=nums[n-1];

n--;

}

i++;

}

return n;

}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值