題目
給你一個數組 nums 和一個值 val,你需要 原地 移除所有數值等于 val 的元素。元素的順序可能發生改變。然后返回 nums 中與 val 不同的元素的數量。
假設 nums 中不等于 val 的元素數量為 k,要通過此題,您需要執行以下操作:
更改 nums 數組,使 nums 的前 k 個元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
返回 k。
示例 1:
輸入:nums = [3,2,2,3], val = 3
輸出:2, nums = [2,2,,]
解釋:你的函數函數應該返回 k = 2, 并且 nums 中的前兩個元素均為 2。
你在返回的 k 個元素之外留下了什么并不重要(因此它們并不計入評測)。
示例 2:
輸入:nums = [0,1,2,2,3,0,4,2], val = 2
輸出:5, nums = [0,1,4,0,3,,,_]
解釋:你的函數應該返回 k = 5,并且 nums 中的前五個元素為 0,0,1,3,4。
注意這五個元素可以任意順序返回。
你在返回的 k 個元素之外留下了什么并不重要(因此它們并不計入評測)。
int removeElement(int* nums, int numsSize, int val){}
思路1
開辟一個與原數組nums大小相同的數組dst,并創建一個記錄有效數據個數的變量k=0。遍歷nums,當遇到nums[i]!=val時,就將nums[i]放到dst中。最后將dst中的內容memcpy到nums。返回k。
int removeElement(int* nums, int numsSize, int val) {int* dst = (int*)malloc(sizeof(int) * numsSize);int k = 0;for (int i = 0; i < numsSize; i++){if (nums[i] != val){dst[k++] = nums[i];}}nums = (int*)memcpy(nums, dst, k * sizeof(int));return k;
弊處:
額外開辟了空間,造成資源浪費
思路2
雙指針在原數組上進行修改。
src負責遍歷數組,dst負責記錄有效數據的位置,k儲存有效數據個數。
src遍歷數組的同時判斷是否為有效數據,如是則dst++;若不是,只有src++
int removeElement(int* nums, int numsSize, int val) {
//src和dst都從原數組nums初始位置開始int* src = nums;int* dst = nums;int k = 0;while (src < nums + numsSize){//src判斷完一個數據就++if (*src != val){//只有找到一個有效數據dst才++*dst = *src;dst++;k++;}src++;}return k;
}
雙指針避免了額外浪費空間,且是單次遍歷原數組。
時間復雜度O(n); 空間復雜度O(1)。
雙指針不一定就是指針,也可以是下標的形式。
雙指針
https://blog.csdn.net/xnyxy2431366813/article/details/143966674?fromshare=blogdetail&sharetype=blogdetail&sharerId=143966674&sharerefer=PC&sharesource=xnyxy2431366813&sharefrom=from_link