题目:

解答:
cpp
int maxSubArray(int* nums, int numsSize) {
if (numsSize == 0)
return 0;
int max_num = nums[0];
int pre = 0;
int min_pre = 0;
for (int i = 0; i < numsSize; i++) {
pre += nums[i];
if (pre - min_pre > max_num)
max_num = pre - min_pre;
if (pre < min_pre)
min_pre = pre;
}
return max_num;
}
超时解答:
cpp
#define Max(a,b) ((a>=b)?a:b)
int maxSubArray(int* nums, int numsSize) {
if (numsSize == 0)
return 0;
int max = nums[0];
int cnt[numsSize+1]={};
for(int i=0;i<numsSize;i++){
cnt[i+1]=cnt[i]+nums[i];
}
for(int i=1;i<=numsSize;i++){//O(n^2)
for(int j=0;j<i;j++){
int n=cnt[i]-cnt[j];
max=Max(max,n);
}
}return max;
}
心得:学用前面的前缀求和计算,但是计算最大数时还是用了暴力穷举破解,时间复杂度未降下来。正确答案是记录前缀和,同时记录最小前缀和,相减就得到最大连续数。
题目:

解答:
cpp
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
sort(intervals.begin(),intervals.end());//二维数组排序按照i大小排序
vector<vector<int>> ans;//定义二维数组
for(int i=0;i<intervals.size();){
int t=intervals[i][1];
int j=i+1;
while(j<intervals.size()&&intervals[j][0]<=t){//探究重合部分的最大上限,&&后为限制处于重合部分
t=max(t,intervals[j][1]);//选取最大的数作为上限
j++;
}
ans.push_back({intervals[i][0],t});
i=j;//直接到j继续进行一次判断
}
return ans;
}
};
心得:原先我想的是用区间长度和重叠判断来合并,但其实实现很琐碎。c++实现,可调用方便的创建动态数组,排序(此很关键,之前没想到)。思路主要是:
题目:

解答:
cpp
void reverse(int* nums, int start, int length) {
if (length <= 1)
return;
// 分配临时数组:只需要length个元素
int temp[length];
// 复制到临时数组
for (int i = 0; i < length; i++) {
temp[i] = nums[start + i];
}
// 反转后复制回原数组
for (int i = 0; i < length; i++) {
nums[start + i] = temp[length - 1 - i];
}
}
void rotate(int* nums, int numsSize, int k) {
if (numsSize <= 1)
return; // 空数组或单元素
k = k % numsSize; // 关键!处理k大于数组大小的情况
if (k == 0)
return;
reverse(nums, 0, numsSize - k);
reverse(nums, numsSize - k, k);
reverse(nums, 0, numsSize);
}
心得:王道书上原题,可以反转多次实现移动,空间换时间的算法,但仍需要注意如何实现反转。
