1. 27. 移除元素 (Remove Element)
題目要求:
給定數組 nums 和值 val,移除所有數值等於 val 的元素,返回移除後數組的新長度 k。要求原地修改數組,使得前 k 個元素為不等於 val 的元素。
解題思路:
- 使用雙指針的方法:一個指針遍歷數組,另一個指針標記不等於
val的元素。 - 每次遇到不等於
val的元素時,將其放置到前面的空位,並更新指針。 - 返回最後標記的不等於
val的元素數量。
解題過程:
解法一:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int n = nums.size(); //元素個數
int i = 0;
while (i < n) {
if (nums[i] == val) {
for (int j = i; j < n -1; j++) {
nums[j] = nums [j + 1];
} //依次前移一位
n--; //去掉移動到最後的元素
} else {
i++;
}
}
return n; //返回最終的元素個數
}
};
//暴力移動
解法二:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int s = 0; //
for (int f = 0; f < nums.size(); f++) { //快指針遍歷
if (nums[f] != val) { //查找非val元素
nums[s] = nums[f]; //快指針遍歷查到非val元素,慢指針才會前進-->慢指針停止前進則下一個一定是非val元素的存放地址;
s++; //更換後再進行同步前進查詢,s++記錄非val元素個數
}
}
return s;
}
};
2. 704. 二分查找 (Binary Search)
題目要求:
在升序排列的整數數組 nums 中查找 target,若找到則返回其下標,否則返回 -1。要求時間複雜度為 O(log n)。
解題思路:
- 使用經典的二分查找方法:通過不斷縮小查找範圍,將目標與中間元素比較。
- 若目標等於中間元素,則返回該元素的下標。
- 否則,根據目標值與中間元素的大小關係更新左右邊界,繼續查找。
示例:
- 輸入:
nums = [-1,0,3,5,9,12], target = 9→ 輸出:4 - 輸入:
nums = [-1,0,3,5,9,12], target = 2→ 輸出:-1
約束條件:
- 數組元素不重複
- 數組長度
1 <= nums.length <= 10000 - 元素值範圍
-9999 <= nums[i] <= 9999
解題過程:
解法一:
class Solution {
public:
int search(vector<int>& nums, int target) {
int sub = 0; //下標從0開始
for (auto i : nums) { //auto i : nums --- i 直接指向nums中的元素
if ( target == i) { //遍歷元素依次比對目標元素
return sub; //找到則返回下標值
}
sub++; //本輪查詢未找到,循環查找下一個元素
}
return -1; //循環結束未找到,則返回-1
}
};
解法二:
class Solution {
public:
int search(vector<int>& nums, int target) {
//int i = nums.size() - 1;//size()返回值為元素個數,size()-1直接匹配下標
for (int i=0; i < nums.size(); i++) {
if ( nums[i] == target ) {
return i;
}
}
return -1;
}
};
解法三:
class Solution {
public:
int search(vector<int>& nums, int target) {
int i = 0,j = nums.size() - 1;
while(i <= j) {
int m = (i + j) / 2;
if(nums[m] == target) {
return m;
}else if (nums[m] > target) {
j = m - 1;
}else {
i = m + 1;
}
}
return -1;
}
};
//奇數:3個-->i=0.j=2,mid=(i+j)/2-->j=mid||i=mid;
//偶數:4個-->i=0,j=3,mid=(i+j)/2-->i=mid+1||j=mid;mid=(i+j)/2+1-->i=mid,j=mid-1
//不用考慮奇偶,不越界溢出即可
解法四:
class Solution {
public:
int search(vector<int>& nums, int target) {
int i = 0, j = nums.size();
while (i < j) {
int m = i + (j - i) / 2;
if (nums[m] > target) { //左區間
j = m;
} else if (nums[m] == target) {
return m;
} else {
i = m + 1; //左區間
}
}
return -1;
}
};
3. 977. 有序數組的平方 (Squares of a Sorted Array)
題目要求:
給定一個非遞減順序排序的整數數組 nums,返回每個數字平方後按非遞減順序排序的數組。要求設計 O(n) 時間複雜度的算法。
解題思路:
- 使用雙指針方法:一指針從左邊開始,另一指針從右邊開始。
- 計算左右指針所指元素的平方,較大的平方先放入結果數組的末尾。
- 根據左右指針的比較,逐步填充結果數組。
示例:
- 輸入:
[-4,-1,0,3,10]→ 輸出:[0,1,9,16,100] - 輸入:
[-7,-3,2,3,11]→ 輸出:[4,9,9,49,121]
約束條件:
1 <= nums.length <= 10^4-10^4 <= nums[i] <= 10^4nums已按非遞減順序排序
解題過程:
解法一:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
for(int i=0;i<nums.size();i++){
nums[i]=nums[i]*nums[i];
}
sort(nums.begin(),nums.end());
return nums;
}
};
解法二:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int n = nums.size();
vector <int> newans(n);
int i = 0, j = n - 1;
for (int p = n - 1; p >= 0; p--) {
if (nums[i] * nums[i] > nums[j] * nums[j]) {
newans[p] = nums[i] * nums[i];
i++;
} else {
newans[p] = nums[j] * nums[j];
j--;
}
}
return newans;
}
};
本文章為轉載內容,我們尊重原作者對文章享有的著作權。如有內容錯誤或侵權問題,歡迎原作者聯繫我們進行內容更正或刪除文章。