標籤:
刪掉數組中與給出值相同的元素,返回新長度。
“The order of elements can be changed. It doesn‘t matter what you leave beyond the new length.”(!這是重點提示!)
【思路】
題目有了第二句就很好辦了,數組順序可以改變,超過新長度的可以不計,那麼就要兩個標記(指標)ij。<-雙指標思想
i從前向後遍曆,j從後向前,A[i]==elem時,swap(A[i], A[j])。
【my code】
int removeElement(int A[], int n, int elem) { int i,j; int length=n; for(i=0, j=n-1; i<=j; i++) { while(A[j]==elem&&j>=0){ j--; length--; } if(A[i]==elem&&j>0){ A[i]=A[j]; A[j]=elem; j--; length--; } } return length;}
【other code】
int removeElement(int A[], int n, int elem) { // Start typing your C/C++ solution below // DO NOT write int main() function int start = 0; for(int i = 0; i < n; i++) if (elem != A[i]) { A[start++] = A[i]; } return start; }
【評價】
別人的代碼總是這麼漂亮╮(╯﹏╰)╭
總結:雙指標思想。
問題求相等/重複,就要反著思考,找到要保留的元素,從前到後按序重寫,因為用來尋找的指標總是快於重寫的指標,所以不會有漏掉要保留元素的情況。
切記這種思路,要省很多事。
【經驗】
leecode的測試結果如果是Runtime Error,一般是因為有特殊情況沒考慮到。
常常在輸入參數非常小的情況。
OJ練習12——T27 Remove Element