力扣热题100题解(c++)—子串、普通数组(不包含困难)

子串

560.和为k的子数组

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。
子数组是数组中元素的连续非空序列。

        unordered_map<int, int> prefixSumCount;
        prefixSumCount[0] = 1; // 前缀和为0的情况(起始)
        int sum = 0;
        int count = 0;

        for (int num : nums) 
        {
            sum += num;
            // 如果存在前缀和为sum - k的情况,则说明中间子数组和为k
            if (prefixSumCount.count(sum - k)) 
            {
                count += prefixSumCount[sum - k];
            }
            // 记录当前前缀和出现次数
            prefixSumCount[sum]++;
        }
        return count;

普通数组

53.最大子数组和

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组是数组中的一个连续部分。

    int max_sum = nums[0];   // 记录当前最大子数组和
    int current_sum = 0;     // 当前子数组和

    for (int num : nums) 
    {
        current_sum += num;
        if (current_sum > max_sum) 
        {
            max_sum = current_sum;
        }
        if (current_sum < 0) 
        {
            current_sum = 0;  // 如果当前和变成负数,从下一个元素重新开始累加
        }
    }

    return max_sum;

56.合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

   if (intervals.empty()) 
   {
        return {};
    }

    // 2. 按照区间的起始位置进行排序
    sort(intervals.begin(), intervals.end());

    // 3. 合并重叠区间
    vector<vector<int>> merged;
    merged.push_back(intervals[0]); // 先放入第一个区间

    for (int i = 1; i < intervals.size(); ++i) 
    {
        vector<int>& currentInterval = intervals[i];
        vector<int>& lastMergedInterval = merged.back();

        if (currentInterval[0] <= lastMergedInterval[1]) 
        {
            // 当前区间与上一个合并的区间重叠
            lastMergedInterval[1] = max(lastMergedInterval[1], currentInterval[1]);
        } 
        else 
        {
            // 当前区间与上一个合并的区间不重叠,直接加入结果
            merged.push_back(currentInterval);
        }
    }

    return merged;

189.轮转数组

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

    int n = nums.size();
    k = k % n;

    // 1. 翻转整个数组
    reverse(nums.begin(), nums.end());

    // 2. 翻转前 k 个元素
    reverse(nums.begin(), nums.begin() + k);

    // 3. 翻转剩余的 n-k 个元素
    reverse(nums.begin() + k, nums.end());

238.除自身以外数组的乘积

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请 不要使用除法,且在 O(n) 时间复杂度内完成此题。

    int n = nums.size();
    vector<int> result(n, 1);  // 初始化结果数组

    // 1. 计算前缀积
    int prefix = 1;
    for (int i = 0; i < n; ++i) 
    {
        result[i] = prefix;      // 当前位置的结果是之前所有元素的乘积
        prefix *= nums[i];         // 更新前缀积
    }

    // 2. 计算后缀积,并与前缀积相乘
    int postfix = 1;
    for (int i = n - 1; i >= 0; --i) 
    {
        result[i] *= postfix;     // 将后缀积乘到当前位置的结果上
        postfix *= nums[i];        // 更新后缀积
    }

    return result;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值