一、題目
二、解題思路
1、我的思路
因為題目中說“元素的順序可以改變。你不需要考慮數組中超出新長度后面的元素。”也就是說:
輸入:nums = [3,2,2,3], val = 3
輸出:2, nums = [2,2]
解釋:函數應該返回新的長度 2
并且 nums 中的前兩個元素均為 2。你不需要考慮數組中超出新長度后面的元素。例如,函數返回的新長度為 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也會被視作正確答案。
所以我的想法是,我們要盡量避免在數組中刪除元素這種事件復雜度高的操作,所以當元素值和val相同時,我們可以不必將它刪除,而是將它和數組的最后一個元素交換位置,同時讓數組長度減1
和上一題(上一篇博客)的想法一樣:我們定義一個計數器count,來記錄交換元素的次數,nums.length - count 即為新數組的長度
值得注意的是:在交換之后,我們不知道換到前面的數是否也等于val,所以還需執行i--
于是我寫了如下代碼,第一次提交就通過了,而且代碼時間效率擊敗了100%的Java用戶,給我整笑了
int count = 0;for (int i = 0; i < nums.length - count; i++) {if(nums[i] == val){int temp = nums[i];nums[i] = nums[nums.length - count -1];nums[nums.length - count -1] = temp;count++;i--;}}return nums.length - count;
2、官方題解
方法一:雙指針
這題官方題解的思路和上一題(上一篇博客)基本一樣
class Solution {public int removeElement(int[] nums, int val) {int n = nums.length;int left = 0;for (int right = 0; right < n; right++) {if (nums[right] != val) {nums[left] = nums[right];left++;}}return left;}
}作者:力扣官方題解
鏈接:https://leetcode.cn/problems/remove-element/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
方法二:雙指針優化
class Solution {public int removeElement(int[] nums, int val) {int left = 0;int right = nums.length;while (left < right) {if (nums[left] == val) {nums[left] = nums[right - 1];right--;} else {left++;}}return left;}
}作者:力扣官方題解
鏈接:https://leetcode.cn/problems/remove-element/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
?