一、移除元素
1、題目描述
?
2、算法分析?
思路1:查找val值對應的下標pos,執行刪除pos位置數據的操作。
????????該方法時間復雜度為O(n^2),因此不建議使用。
思路2:創建新數組(空間大小與原數組一致),遍歷原數組,將非val值放到tmp數組中,再將tmp數組拷貝回原數組。
????????該方法時間復雜度O(N),空間復雜度O(N)。體現了用空間換時間的思想。
思路3:雙指針法
? ? ? ? 創建兩個變量dst 和 src,(1)nums[src] == val,src++? ?
(2)nums[src] != val,賦值(src給dst),dst++,src++
3、參考代碼
int removeElement(int* nums, int numsSize, int val)
{//定義兩個變量int dst = 0, src = 0;while(src < numsSize){//src值和val比較if(nums[src] != val){nums[dst] = nums[src];dst++;}src++;}return dst;
}
二、刪除有序數組中的重復項
1、題目描述
2、算法分析?
思路:雙指針法
? ? ? ? 創建兩個變量,分別指向起始位置和下一個位置。
(1)nums[src] == nums[dst],src++
(2)nums[src] != nums[dst],dst++,賦值(src給dst),src++
3、參考代碼
int removeDuplicates(int* nums, int numsSize)
{int dst = 0, src = dst + 1;while(src < numsSize){if(nums[src] != nums[dst]){dst++;nums[dst] = nums[src];}src++;} return dst + 1;
}
三、合并兩個有序數組
1、題目描述
2、算法分析?
思路1:先合并,再排序
? ? ? ? 冒泡排序:O(N^2)? ? ? ?qsort:O(NlogN)
思路2:空間換時間
? ? ? ? 創建新數組tmp,空間大小和nums1一致,遍歷兩個原數組的數據并比較大小,放到tmp中。
思路3:從后往前比較大小,找大的
? ? ? ? 注意:不能從前往后比較大小找小的,因為小的往前放會導致數據被覆蓋!
?
?3、參考代碼
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{int l1 = m - 1;int l2 = n - 1;int l3 = m + n - 1;while(l1 >= 0 && l2 >= 0){//比較大小,找大if(nums1[l1] < nums2[l2]){nums1[l3] = nums2[l2];l2--;l3--;}else{nums1[l3] = nums1[l1];l1--;l3--;}}//要么l1先越界,要么l2先越界while(l2 >= 0){nums1[l3] = nums2[l2];l3--;l2--;}
}