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);
}
心得:王道书上原题,可以反转多次实现移动,空间换时间的算法,但仍需要注意如何实现反转。
相关推荐
AI小码10 分钟前
把动作「画」给视频世界模型,跨本体双向推演,李飞飞参与
大数据·人工智能·算法·ai·大模型·音视频·编程
KaMeidebaby1 小时前
卡梅德生物技术快报|bli亲和力检测gst:告别批量跑胶:BLI实时酶切监测技术加速GST融合蛋白下游流程优化
前端·网络·数据库·人工智能·算法
alphaTao2 小时前
LeetCode 每日一题 2026/7/20-2026/7/26
算法·leetcode
圣保罗的大教堂3 小时前
leetcode 3514. 不同 XOR 三元组的数目 II 中等
leetcode
青山木6 小时前
Hot 100 ---腐烂的橘子
java·数据结构·后端·算法·leetcode·广度优先
未来之窗软件服务6 小时前
计算机考试-快速排序—东方仙盟
数据结构·算法·排序算法·仙盟创梦ide·东方仙盟
小龙报6 小时前
【优选算法】1. 水果成蓝 2.找到字符串中所有字母的异位词
java·c语言·数据结构·数据库·c++·redis·算法
wWYy.6 小时前
数据结构:跳表
数据结构
txzrxz7 小时前
数论:排列数、组合数、费马小定理、逆元、同余定理
c++·算法·数论·组合数·费马小定理·逆元·排列数
xqqxqxxq7 小时前
LeetCode Hot100 双指针专项题解笔记
笔记·算法·leetcode