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);
}
心得:王道书上原题,可以反转多次实现移动,空间换时间的算法,但仍需要注意如何实现反转。
相关推荐
倒头就睡的小比特2 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼2 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
m0_547486662 天前
《数据结构教程》全套 PPT课件2026
数据结构
旖旎夜光2 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark2 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her12 天前
并查集-听课笔记
笔记·算法·并查集
码流子2 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven2 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark2 天前
从算法设计模式看编程思维的抽象能力4
算法