704. 二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
解法:一个while解决。
class Solution {
public:
int search(vector<int>& nums, int target) {
// 左闭右开
int left = 0;
int right = nums.size();
while(left < right){
int mid = left / 2 + right / 2;
if(nums[mid] > target) right = mid;
else if(nums[mid] < target) left = mid + 1;
else return mid;
}
return -1;
}
};
27. 移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
解法:快慢指针法;快指针用于条件判断,慢指针用于存值
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
// 快慢指针法
int leftIndex = 0;
for(int rightIndex = 0; rightIndex < nums.size(); rightIndex++){
if(nums[rightIndex] != val){ // 快指针用于条件判断,慢指针用于存值
nums[leftIndex] = nums[rightIndex];
leftIndex++;
}
}
return leftIndex;
}
};
977.有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
解法:双指针法
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
// 双指针法
// 左闭右闭
int left = 0;
int right = nums.size() - 1;
int index = nums.size() - 1;
vector<int> result(nums.size());
while(left <= right){
if(nums[right] * nums[right] >= nums[left] * nums[left]) {
result[index] = nums[right] * nums[right];
right--;
}else{
result[index] = nums[left] * nums[left];
left++;
}
index--;
}
return result;
}
};
209.长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
解法:快慢指针法;记得先存值再更新sum。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
// 快慢指针
// 左闭右闭
int left = 0;
int result = INT32_MAX;
int sum = 0;
for(int right = 0; right < nums.size(); right++){
sum += nums[right];
while(sum >= target){
result = right - left + 1 < result ? right - left + 1 : result; // 先存值
sum -= nums[left++];
}
}
return result == INT32_MAX ? 0 : result;
}
};
59.螺旋矩阵II
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
解法:最外圈一层一层算。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> result(n, vector<int>(n));
// 左闭右闭
int start = 0;
int end = n - 1;
int index = 1;
if(n % 2) result[n/2][n/2] = n * n;
while(n >= 2){
for(int j = start; j < end; j++) result[start][j] = index++;
for(int i = start; i < end; i++) result[i][end] = index++;
for(int j = end; j > start; j--) result[end][j] = index++;
for(int i = end; i > start; i--) result[i][start] = index++;
start++;
end--;
n -= 2;
}
return result;
}
};
参考:
1、代码随想录