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);
}
心得:王道书上原题,可以反转多次实现移动,空间换时间的算法,但仍需要注意如何实现反转。
相关推荐
心中有国也有家12 小时前
cann-recipes-infer:昇腾 NPU 推理的“菜谱集合”
经验分享·笔记·学习·算法
绝知此事13 小时前
【算法突围 01】线性结构与哈希表:后端开发的收纳术
java·数据结构·算法·面试·jdk·散列表
碧海银沙音频科技研究院13 小时前
通话AEC与语音识别AEC的软硬回采链路
深度学习·算法·语音识别
csdn_aspnet13 小时前
Python 算法快闪 LeetCode 编号 70 - 爬楼梯
python·算法·leetcode·职场和发展
LuminousCPP14 小时前
数据结构 - 线性表第四篇:C 语言通讯录优化升级全记录(踩坑 + 思考)
c语言·开发语言·数据结构·经验分享·笔记·学习
AI算法沐枫14 小时前
深度学习python代码处理科研测序数据
数据结构·人工智能·python·深度学习·决策树·机器学习·线性回归
m0_6294947316 小时前
LeetCode 热题 100-----26.环形链表 II
数据结构·算法·leetcode·链表
壹号用户16 小时前
用队列实现栈
数据结构·算法
做人求其滴17 小时前
面试经典 150 题 380 274
c++·算法·面试·职场和发展·力扣