解题思路:前缀和 动态规划
主要思路利用前缀和 然后前缀和sum-minsum等于最终的结果 minsum怎么求呢 minsum=min(minsum,sum)
因为sum的前缀和有可能为负值 如果负值的话就取负值如果是正值就取0minsum;
cpp
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int result = INT_MIN,sum = 0,minsum = 0;
for(int i = 0;i<nums.size();i++){
sum += nums[i];
result = max(result,sum-minsum);
minsum = min(minsum,sum);
}
return result;
}
};
解题思路:
首先排序 二维数组排序只排第一列 然后 result.back()[1] = max(result.back()[1],right);right=intervals[i][1],right就是右边界
cpp
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
if(intervals.size() == 0)return {};
sort(intervals.begin(),intervals.end());
vector<vector<int>>result;
for(int i = 0;i<intervals.size();i++){
int left = intervals[i][0],right = intervals[i][1];
if(!result.size() || result.back()[1] < left){
result.push_back({left,right});
}
else{
result.back()[1] = max(result.back()[1],right);
}
}
return result;
}
};
解题思路:反转
注意本题没有保证 k 小于数组长度 n。由于轮转 n 次等于没有轮转,轮转 n+1 等于轮转 1 次,依此类推,轮转 k 次等于轮转 kmodn 次。
先反转全部,然后在反转前k个 然后在反转后面所有的;
cpp
class Solution {
public:
void rotate(vector<int>& nums, int k) {
k %= nums.size();
reverse(nums.begin(),nums.end());
reverse(nums.begin(),nums.begin()+k);
reverse(nums.begin()+k,nums.end());
}
};
解题思路:相当于前后缀分解
把这个自身的左边和右边分为两个部分,然后用两个for循环分别表示左边的成绩和右边的成绩
cpp
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int n = nums.size();
vector<int>suf(n,1);
for(int i = n-2;i>=0;i--){
suf[i] = suf[i+1]*nums[i+1];
}
int pre = 1;
for(int i = 0;i<n;i++){
suf[i] *= pre;
pre *= nums[i];
}
return suf;
}
};
解题思路:将数组视为哈希表 我们将所有1到n范围内的数放入哈希表中,也可以得到最终的答案。将数组下标从 0 开始)打上「标记」。
首先将所有的负数都变为n+1 因为n+1肯定不会被找到
然后将所有<n的数变为负数 返回第一个大于0下标+1
cpp
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n = nums.size();
for(int i = 0;i< n;i++){
if(nums[i] <= 0){
nums[i] = n+1;
}
}
for(int i = 0;i<n;i++){
int num = abs(nums[i]);
if(num <= n){
nums[num-1] = -abs(nums[num-1]);
}
}
for(int i = 0;i<n;i++){
if(nums[i]>0){
return i+1;
}
}
return n+1;
}
};