53. 最大子数组和
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int n = nums.size();
int ans = nums[0];
int sum = 0;
for (int i = 0; i < n; i++) {
sum += nums[i];
ans = max(ans, sum);
if (sum < 0) sum = 0;
}
return ans;
}
};
最大子数组和,贪心即可
56. 合并区间
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> ans;
sort(intervals.begin(), intervals.end());
int L = -1, R = -1;
for (auto vec: intervals) {
int l = vec[0], r = vec[1];
if (l > R) {
if (R != -1) {
ans.push_back({L, R});
}
L = l, R = r;
}
R = max(R, r);
}
ans.push_back({L, R});
return ans;
}
};
排序,贪心。区间合并板子题
189. 轮转数组
class Solution {
public:
void rotate(vector<int>& nums, int k) {
vector<int> v;
int n = nums.size();
k %= n;
for (int i = n - 1; i >= n - k; i--) {
v.push_back(nums[i]);
}
reverse(v.begin(), v.end());
for (int i = 0; i <= n - k - 1; i++) {
v.push_back(nums[i]);
}
swap(nums, v);
}
};
模拟,注意k可能大于数组大小即可
238. 除自身以外数组的乘积
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int n = nums.size();
vector<int> a(n + 10, 0);
for (int i = 1; i <= n; i++) a[i] = nums[i - 1];
vector<int> pre(n + 10, 0);
vector<int> suf(n + 10, 0);
pre[0] = 1;
suf[n + 1] = 1;
for (int i = 1; i <= n; i++) {
pre[i] = pre[i - 1] * a[i];
}
for (int i = n; i >= 1; i--) {
suf[i] = suf[i + 1] * a[i];
}
vector<int> ans;
for (int i = 1; i <= n; i++) {
int x = pre[i - 1] * suf[i + 1];
ans.push_back(x);
}
return ans;
}
};
前缀积和后缀积
41. 缺失的第一个正数
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n = nums.size();
int max = n + 1;
for (int i = 0; i < n; i++) {
if (nums[i] <= 0 || nums[i] >= max) {
nums[i] = max;
}
}
for (int i = 0; i < n; i++) {
int t = abs(nums[i]);
if (t <= n) {
nums[t - 1] = -abs(nums[t - 1]);
}
}
for (int i = 0; i < n; i++) {
if (nums[i] > 0) {
return i + 1;
}
}
return max;
}
};
贪心结论,答案范围是[1, n + 1]
再通过一些技巧标记原数组表示哪个数存在