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);
}
心得:王道书上原题,可以反转多次实现移动,空间换时间的算法,但仍需要注意如何实现反转。
相关推荐
小郎君65817 分钟前
Vue 多标签页的加载态设计:为什么我没有用 Suspense 实现 PageLoading
vue.js·算法
JJJennie7771 小时前
MAI Gateway私有化部署全攻略:大模型网关如何接入?附架构图
算法·gateway·ai网关·魔芋ai
東隅已逝,桑榆非晚1 小时前
算法3.双指针法-快乐数
c++·笔记·学习·算法
专注仿真1 小时前
卷积神经网络(CNN)算法详解
人工智能·python·算法·代码·大模型训练
FII工业富联科技服务1 小时前
多智能体如何进入制造现场?从业务协同到数字孪生验证
大数据·人工智能·算法·机器人·制造·数字孪生
≮傷£≯√1 小时前
httpserver_QNetWorkClient
算法
Evand J1 小时前
【PMSM例程11】永磁同步电机(PMSM)基于UKF的转速与转子位置估计。附下载链接
算法·matlab·卡尔曼滤波·永磁同步电机·ukf·pmsm·位置估计
货拉拉技术1 小时前
记忆即智能:重构对话式AI Agent认知基座的四层渐进式记忆与自进化系统
人工智能·算法
杜 硕2 小时前
从零开始的C++生活——第六讲——02
c++·算法·生活
小超人诞生日记2 小时前
C++ STL 反向迭代器:从源码框架到适配器实现
c++·算法