2026.1.16力扣刷题

题目:

解答:

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);
}
心得:王道书上原题,可以反转多次实现移动,空间换时间的算法,但仍需要注意如何实现反转。
相关推荐
地平线开发者8 小时前
J6B vio scenario sample
算法
BothSavage20 小时前
Trae远程开发中DeepSeek自定义模型4054错误的排查与修复
算法
小林ixn20 小时前
从暴力到KMP:一道题彻底搞懂字符串匹配的前世今生
算法
烬羽1 天前
字符串算法入门:从反转字符串到回文判断,面试不再慌
算法·面试
先吃饱再说2 天前
判断回文字符串,从一行代码到双指针优化
算法
黄敬峰2 天前
深入理解算法核心:从递归思想、数组扁平化到快速排序
算法
得物技术2 天前
从狂野代码到按目标生产:得物推荐 AI Harness 的工程化实践|AICon 演讲整理
人工智能·算法·架构
AI小老六2 天前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程