关于LeetCode中Remove Element一题的理解

来源:互联网 发布:手机和mac照片同步 编辑:程序博客网 时间:2024/05/18 03:30

题目如下:

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?
    题干给定一个数组,然后给定一个要删除的目标数值,要求在不申请额外存储空间的条件下,将目标数值从给定数组中“删除”,并返回新数组的“长度”。当时看到题目的时候在想,“我靠,怎么从数组中删除元素还不破坏原数组,还不申请额外存储空间?”,后来仔细考虑了下函数的返回值,考虑了所谓的“删除”操作,最后终于得出了一个结论,我把所有不需要删除的元素都移动到数组前面,把需要删除的元素都移动到数组后面,然后返回的值不就相当于新数组的长度吗?由于那些已经删除的元素的位置都在这个新数组的长度之外,所以根本不会被访问到,这样不就变相实现了删除功能吗?了解了这些,思路就应该大致形成了。根据提示声明两个指针,分别从数组开头和末尾扫描,末尾的指针主要作用是跳过那些已经是被删除了的元素(即它们的值等于给定的val值),到第一个没被“删除”的元素的位置后停止。然后,开头位置的指针开始移动,遇到应该被删除的元素就将其和末尾指针所对应的元素进行交换,再将末尾指针向前移动一位(一定要在现在移动,否则之后可能出现重复计算已删除元素的数量,使得最后的结果变小),最后再将开头位置指针向前移动一位即可。按例放上已Accepted的代码:

<span style="font-size:14px;">    public int removeElement(int[] nums, int val) {        int result=0;        int i=0;        int j = nums.length-1;        while(j>=0&&i<=j){            if(nums[j]==val){                j--;                result++;                continue;            }            if(nums[i]==val){                nums[i] = nums[j];                nums[j] = val;                j--;                result++;            }            i++;        }        return nums.length-result;    }</span>
    然后是评论区代码,这个哥们的思路更加简单,我都不需要考虑最后的元素是不是已经被删除的元素,我只需要考虑前面的元素是不是都是未被删除的元素(其实这样写代码量更少,也更简单),思路大致就是这样,然后上评论区代码:

<span style="font-size:14px;">    public int removeElement(int[] nums, int val) {   int m = 0;       for(int i = 0; i < nums.length; i++){              if(nums[i] != val){           nums[m] = nums[i];           m++;       }   }      return m;    }</span>
    有的时候考虑问题全面是好事,但是太全面了有时就会使关键点变得不那么明确,还是要具体问题具体分析吧!(说了一句大大的废话,闪人喽!)


1 0