27Remove Element

来源:互联网 发布:电脑打电话软件下载 编辑:程序博客网 时间:2024/06/06 07:35

题目链接: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: AcceptedRuntime: 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: AcceptedRuntime: 268 ms
0 0
原创粉丝点击