(LeetCode 面试经典 150 题) 27.移除元素
目录
题目:
题目描述:
题目链接:
思路:
核心思路:
思路详解:
样例模拟:
代码:
C++代码:
Java代码:
题目:
题目描述:
题目链接:
27. 移除元素 - 力扣(LeetCode)
思路:
核心思路:
双指针
思路详解:
我们先按最容易理解的思路:定义两个指针i,j,i指针指向第一个元素,j指针指向最后一个元素。我们要遍历数组中所有的元素进行换位调整,所以编译完全部元素的条件是两个指针交错(即i>j)。在while语句中,判断i指向的元素是否等于val,如果不等于那么不用调整直接跳过,即i指针后移。如果i指向的元素等于val,那么我们将i指向的元素和j指向的元素对调。此时换到i上的元素是否等于val我们不知道,所以要到下一轮再判断,但是此时换到j上的元素一定等于val,所以j指针前移。
到最后的i索引一定是最后一个不等于val元素的后一位,所以最后一个不等于val元素的索引为i-1,即一共有i个不等于val的元素。由题要返回不等于val元素的个数,所以返回i。
上述是最容易理解且详细的思路,由题我们其实只需要保证最后nums的前k个元素是不等于val的元素,nums其余元素和nums大小不重要。所以我们不需要i与j指向元素互换,只需要把j指向元素换到i就行了
样例模拟:
代码:
C++代码:
class Solution {
public:int removeElement(vector<int>& nums, int val) {int i = 0; //i指针指向第一个元素int j = nums.size() - 1; //j指针指向最后一个元素//int temp;while(i <= j) //当两个指针交错时表示全部元素已经遍历完了{if(nums[i] != val){i++; //如果i指向的元素不等于val直接跳过,i指针后移}else{//temp = nums[i];nums[i] = nums[j]; //如果i指向的元素等于val,与j指向的元素进行交换//nums[j] = temp;j--; //那么此时j指向的一定是换过来等于val的值,j指针前移}}return i; //由题返回不等于val的元素数量}
};
Java代码:
class Solution {public int removeElement(int[] nums, int val) {int i = 0;int j = nums.length -1;//int temp;while(i <= j){if(nums[i] != val){i++;}else{//temp = nums[i];nums[i] = nums[j];//nums[j] = temp;j--;}}return i;}
}