題目鏈接:27. 移除元素 - 力扣(LeetCode)
第一種思路
標簽:拷貝覆蓋
主要思路是遍歷數組 nums,每次取出的數字變量為 num,同時設置一個下標 ans
在遍歷過程中如果出現數字與需要移除的值不相同時,則進行拷貝覆蓋 nums[ans] = num,ans 自增 1
如果相同的時候,則跳過該數字不進行拷貝覆蓋,最后 ans 即為新的數組長度
這種思路在移除元素較多時更適合使用,最極端的情況是全部元素都需要移除,遍歷一遍結束即可
時間復雜度:O(n),空間復雜度:O(1)
第一種代碼:
var removeElement = function(nums, val) {let ans = 0;for(const num of nums) {if(num != val) {nums[ans] = num;ans++;}}return ans;
};
第二種思路
? 標簽:交換移除
? 主要思路是遍歷數組 nums,遍歷指針為 i,總長度為 ans
? 在遍歷過程中如果出現數字與需要移除的值不相同時,則 i 自增 1 ,繼續下一次遍歷
? 如果相同的時候,則將 nums[i]與nums[ans-1] 交換,即當前數字和數組最后一個數字進行交換,交換后就少了一個元素,故而 ans 自減 1
? 這種思路在移除元素較少時更適合使用,最極端的情況是沒有元素需要移除,遍歷一遍結束即可
? 時間復雜度:O(n) 空間復雜度:O(1)
第二種代碼:
var removeElement = function(nums, val) {let ans = nums.length;for (let i = 0; i < ans;) {if (nums[i] == val) {nums[i] = nums[ans - 1];ans--;} else {i++;}}return ans;
};