1、有序数组的平方
第一种方法,直接调用库函数sort()
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
static vector<int> sortedSquares(vector<int>&nums) {
for (int &num : nums)
num *= num;
sort(nums.begin(), nums.end());
return nums;
}
};
int main() {
vector<int> nums = {-6, -3, -1, 4, 5, 7};
for (auto &c : Solution::sortedSquares(nums)) {
cout << c << " ";
}
}
第二种方法,利用双指针
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
static vector<int> sortedSquares(vector<int>& nums) {
int k = nums.size() - 1;
vector<int> result(nums.size());
int i = 0, j = nums.size() - 1;
while ( i <= j) { // 注意这里要i <= j,因为最后要处理两个元素
if (nums[i] * nums[i] < nums[j] * nums[j]) {
result[k--] = nums[j] * nums[j];
j--;
}
else {
result[k--] = nums[i] * nums[i];
i++;
}
}
return result;
}
};
int main() {
vector<int> nums = {-6, -3, -1, 4, 5, 7};
for (auto &c: Solution::sortedSquares(nums)) {
cout << c << " ";
}
}
2、长度最小的子数组
第一种方法,暴力解法
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
static int minSubArrayLen(int s, vector<int>& nums) {
int result = INT_MAX; //初始化一个足够大的值,在后续更新中只考虑减少
int sum = 0; // 子序列的数值之和
int subLength = 0; // 子序列的长度
for (int i = 0; i < nums.size(); ++i) { // 设置子序列起点为i
sum = 0;
for (int j = i; j < nums.size(); ++j) { // 设置子序列终止位置为j
sum += nums[j];
if (sum >= s) {
subLength = j - i + 1;
result = result < subLength ? result : subLength;
break; //只跳出内层循环
}
}
}
return result == INT_MAX ? 0 : result;
}
};
int main() {
vector<int> nums;
nums = {1, 2, 3, 4};
cout << Solution::minSubArrayLen(7, nums) << endl;
}
第二种解法,滑动窗口
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
static int minSubArrayLen(int target, vector<int>& nums) {
int sum = 0; //子数组之和
int result = INT_MAX; //最终结果
int subLenth = 0; //子数组长度
int i = 0; //左端点
for (int j = 0; j < nums.size(); ++j) {
sum += nums[j];
while (sum >= target) {
subLenth = j - i + 1;
result = result < subLenth ? result : subLenth;
sum -= nums[i++];
}
}
return result == INT_MAX ? 0 : result;
}
};
int main() {
vector<int> nums;
nums = {1, 2, 3, 4};
cout << Solution::minSubArrayLen(7, nums) << endl;
}
3、螺旋矩阵II
第一种方法,利用循环直接做
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
static vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0));
int starx = 0, stary = 0; //每圈循环的起点
int i, j;
int offset = 1; //每圈循环减少的
int loop = n / 2; //循环圈数
int count = 1; //计数器
while (loop--) { //都用左闭右开的区间
i = starx;
j = stary;
for (; j < n - offset; ++j)
res[i][j] = count++;
for (; i < n - offset; ++i)
res[i][j] = count++;
for (; j > stary; --j)
res[i][j] = count++;
for (; i > starx; --i)
res[i][j] = count++;
starx++;
stary++;
offset++;
}
if (n % 2) {
res[n / 2][n / 2] = count++;
}
return res;
}
};
int main() {
vector<vector<int>> vec = Solution::generateMatrix(4);
for (const auto& row : vec) {
for (auto ele : row) {
cout << ele << " ";
}
cout << "\n";
}
}
第二种方法,也可以利用递归