删除元素(LintCode)
删除元素
给定一个数组和一个值,在原地删除与值相同的数字,返回新数组的长度。
元素的顺序可以改变,并且对新的数组不会有影响。
样例
View Code
给出一个数组 [0,4,4,0,0,2,4,4],和值 4
返回 4 并且4个元素的新数组为[0,0,0,2]
思路就是把除删除元素外的元素移到最左边,r是最右端非被删除元素,可以在一开始就找到最右端非被删除元素。用i遍历数组,找到最左端被删除元素,把r所指元素赋到i位置即可。代码里我是先找最左端被删除元素,然后再找最右端非被删除元素。时间复杂度是相同的。
1 public class Solution { 2 /** 3 *@param A: A list of integers 4 *@param elem: An integer 5 *@return: The new length after remove 6 */ 7 public int removeElement(int[] A, int elem) { 8 int r = A.length - 1; 9 if(r < 0) return 0; 10 int i = 0; 11 12 while(r > i) { 13 if(A[i] == elem) { 14 while(A[r] == elem && r > 0) r--; 15 if(r > i) { 16 A[i] = A[r]; 17 r--; 18 } 19 } 20 i++; 21 } 22 23 if(A[r] == elem) r--; 24 25 return r + 1; 26 } 27 }