您的位置:首页 > 其它

27 Remove Element

2015-08-08 18:37 190 查看
题目链接:https://leetcode.com/problems/remove-element/

题目:

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

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


解题思路:

1. i 指针从前向后扫描,遇到值为 val 的位置停下;j 指针从后向前扫描,遇到值为非 val 的位置停下。

2. 交换 i 和 j 位置的元素值。(可以不用交换直接覆盖)

3. 如果 i == j,则判断 i 当前位置的元素值是否为 val,若不为val,说明 i 扫描到了数组的末尾,且 i

之前(包括i)的元素都是有效元素,则长度为 i + 1。

4. 其余情况,i 值即为数组长度。

注意:

有几种特别的输入样例:

[3, 3] 3

[3, 3] 1

需要特别考虑!

nums[i] = nums[j];
j --;


要比

nums[i] = nums[j --];


节省时间得多!

交换元素的方法:

public class Solution {
public int removeElement(int[] nums, int val) {
if(nums == null || nums.length == 0)
return 0;
int len = nums.length;
if(len == 1) {
if(nums[0] == val)
return 0;
else
return 1;
}
int i = 0;
int j = len - 1;
while(i < j) {
while(nums[i] != val && i < j)
i ++;
while(nums[j] == val && i < j)
j --;
if(nums[i] == val && nums[j] != val) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
if(nums[i] != val && i == j) {
i ++;
break;
}
}
return i;
}
}


112 / 112 test cases passed.
Status: Accepted
Runtime: 300 ms


后来想到了可以用 j 位置的元素直接覆盖 i 位置的元素

public class Solution {
public int removeElement(int[] nums, int val) {
if(nums == null || nums.length == 0)
return 0;
int len = nums.length;
if(len == 1) {
if(nums[0] == val)
return 0;
else
return 1;
}
int i = 0;
int j = len - 1;
while(i < j) {
while(nums[i] != val && i < j)
i ++;
while(nums[j] == val && i < j)
j --;
if(nums[i] == val && nums[j] != val) {
nums[i] = nums[j]; j --;
}
if(nums[i] != val && i == j) {
i ++;
break;
}
}
return i;
}
}


112 / 112 test cases passed.
Status: Accepted
Runtime: 268 ms
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: