创建新的数组保存结果,双指针
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> result(nums.size(), 0);
int n = nums.size() - 1;
for (int left = 0, right = nums.size() - 1; left <= right;) {
if (nums[left] * nums[left] > nums[right] * nums[right]) {
result[n--] = nums[left] * nums[left];
++left;
} else {
result[n--] = nums[right] * nums[right];
--right;
}
}
return result;
}
};
滑动窗口
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int result = INT_MAX;
int sum = 0;
for(int left = 0, right = 0; right < nums.size(); ++right){
sum += nums[right];
while(sum >= target){
result = min(result, right - left + 1);
sum -= nums[left++];
}
}
return result == INT_MAX ? 0 : result;
}
};
模拟,用count计数来控制循环,不用考虑n的奇偶性。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> result(n, vector<int>(n, 0));
int left = 0, right = n - 1;
int up = 0, down = n - 1;
int count = 1;
while (count <= n * n) {
for (int i = left; i <= right; ++i){
result[up][i] = count++;
}
++up;
for (int i = up; i <= down; ++i){
result[i][right] = count++;
}
--right;
for (int i = right; i >= left; --i){
result[down][i] = count++;
}
--down;
for (int i = down; i >= up; --i){
result[i][left] = count++;
}
++left;
}
return result;
}
};
当子数组长度为奇数时
左侧小于 + 右侧小于 = 左侧大于 + 右侧大于 => 左侧小于 − 左侧大于 = 右侧大于 − 右侧小于
当子数组长度为偶数时
左侧小于 + 右侧小于 = 左侧大于 + 右侧大于 => 左侧小于 − 左侧大于 = 右侧大于 − 右侧小于 - 1
class Solution {
public:
int countSubarrays(vector<int>& nums, int k) {
// 必定包含k,先找到k的位置,再往两边扩展
int index = 0;
for (int i = 0; i < nums.size(); ++i) {
if (nums[i] == k) {
index = i;
break;
}
}
unordered_map<int, int> cnt{{0, 1}};
for (int i = index - 1, sum = 0; i >= 0; --i) {
sum += (nums[i] < k ? 1 : -1);
++cnt[sum];
}
int result = cnt[0] + cnt[-1];
for (int i = index + 1, sum = 0; i < nums.size(); ++i) {
sum += (nums[i] > k ? 1 : -1);
result += cnt[sum] + cnt[sum - 1];
}
return result;
}
};