力扣热题100——数组

最大子数组和

在这里插入图片描述

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int n = nums.size();
        if (n == 0) return 0;
        int pre = nums[0]; // 保存以当前元素前一个元素结尾的最大子数组和
        int maxSum = pre;
        for (int i = 1; i < n; ++i) {
            pre = max(pre + nums[i], nums[i]);
            maxSum = max(maxSum, pre);
        }
        return maxSum;
    }
};

合并区间

在这里插入图片描述

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        vector<vector<int>> res;
        sort(intervals.begin(),intervals.end());
        for(int i=0;i<intervals.size();){
            int last=intervals[i][1];
            int j=i+1;
            while(j<intervals.size()&&intervals[j][0]<=last){
                last=max(last,intervals[j][1]);
                j++;
            }
            res.push_back({intervals[i][0],last});
            i=j;
        }
        return res;
    }
};

轮转数组

在这里插入图片描述

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int n=nums.size();
        k%=n;
        reverse(nums.begin(),nums.end());
        reverse(nums.begin(),nums.begin()+k);
        reverse(nums.begin()+k,nums.end());
    }
};

除自身以外数组的乘积

在这里插入图片描述

#include <vector>
using namespace std;

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int n = nums.size();
        vector<int> result(n, 1);  // 替换错误的数组定义,使用vector
        //result[1,1,1,1]
        // 计算前缀积:result[i] 存储 nums[0..i-1] 的乘积
        for (int i = 1; i < n; ++i) {
            result[i] = result[i - 1] * nums[i - 1];
        }
        
        // 计算后缀积并与前缀积相乘,得到最终结果
        int suffix = 1;  // 用于存储后缀积
        for (int i = n - 1; i >= 0; --i) {
            result[i] *= suffix;  // 前缀积 × 后缀积
            suffix *= nums[i];    // 更新后缀积
        }
        
        return result;
    }
};

第一个循环的作用是:计算当前元素左侧所有元素的乘积

  for (int i = 1; i < n; ++i) {
            result[i] = result[i - 1] * nums[i - 1];
        }

假设输入为【2,3,4,5】
当 i=1 时:
result[1] = result[0] * nums[0] = 1 * 2 = 2
此时 result = [1, 2, 1, 1]
(表示索引 1 左侧只有元素 2)
当 i=2 时:
result[2] = result[1] * nums[1] = 2 * 3 = 6
此时 result = [1, 2, 6, 1]
(表示索引 2 左侧元素是 2 和 3,乘积为 6)
当 i=3 时:
result[3] = result[2] * nums[2] = 6 * 4 = 24
此时 result = [1, 2, 6, 24]
(表示索引 3 左侧元素是 2、3、4,乘积为 24)
第二个循环:计算后缀积并合并结果(从右到左)

int suffix = 1;  // 用于存储后缀积
        for (int i = n - 1; i >= 0; --i) {
            result[i] *= suffix;  // 前缀积 × 后缀积
            suffix *= nums[i];    // 更新后缀积
        }

当 i=3 时:
第一步:result[3] *= suffix → 24 * 1 = 24
(索引 3 右侧没有元素,后缀积为 1)
第二步:suffix *= nums[3] → 1 * 5 = 5
此时 result = [1, 2, 6, 24],suffix = 5
当 i=2 时:
第一步:result[2] *= suffix → 6 * 5 = 30
(索引 2 右侧元素是 5,乘积为 5)
第二步:suffix *= nums[2] → 5 * 4 = 20
此时 result = [1, 2, 30, 24],suffix = 20
当 i=1 时:
第一步:result[1] *= suffix → 2 * 20 = 40
(索引 1 右侧元素是 4、5,乘积为 20)
第二步:suffix *= nums[1] → 20 * 3 = 60
此时 result = [1, 40, 30, 24],suffix = 60
当 i=0 时:
第一步:result[0] *= suffix → 1 * 60 = 60
(索引 0 右侧元素是 3、4、5,乘积为 60)
第二步:suffix *= nums[0] → 60 * 2 = 120
最终 result = [60, 40, 30, 24]

缺失的第一个证书

在这里插入图片描述

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        unordered_set<int> numset;

        for(int num:nums){
            if(num>0)
                numset.insert(num);
        }

        int i=1;
        while(true){
            if(numset.find(i)==numset.end()){
                return i;
            }
            i++;
            }       
        }
};
### 力扣 HOT 100 中与 Python 相关的目及解决方案 力扣LeetCode)上的目列表——HOT 100 是许多开发者练习算法和数据结构的重要资源。以下是几个典型的 HOT 100 目及其对应的 Python 解决方案概述。 #### 两数之和 (Two Sum) 这是一个经典的入门级问,目标是从给定数组中找到两个数,使它们相加等于指定的目标值。可以通过哈希表来优化查找过程[^2]。 ```python def twoSum(nums, target): hashmap = {} for i, num in enumerate(nums): complement = target - num if complement in hashmap: return [hashmap[complement], i] hashmap[num] = i ``` #### 最长连续序列 (Longest Consecutive Sequence) 此问是关于如何高效地找出未排序整数数组中最长的连续元素序列。可以利用集合的数据结构特性实现 O(n) 时间复杂度的解决方法[^3]。 ```python def longestConsecutive(nums): nums_set = set(nums) max_length = 0 for num in nums_set: if num - 1 not in nums_set: current_num = num current_streak = 1 while current_num + 1 in nums_set: current_num += 1 current_streak += 1 max_length = max(max_length, current_streak) return max_length ``` #### 字符串中的所有字母异位词 (Find All Anagrams in a String) 该问要求在一个较长字符串中定位所有的短字符串的字母排列位置。滑动窗口技术配合字符计数能够有效解决问。 ```python from collections import defaultdict def findAnagrams(s, p): result = [] need = defaultdict(int) window = defaultdict(int) for c in p: need[c] += 1 left = right = valid = 0 start = length = 0 while right < len(s): c = s[right] right += 1 if c in need: window[c] += 1 if window[c] == need[c]: valid += 1 while right - left >= len(p): if valid == len(need): result.append(left) d = s[left] left += 1 if d in need: if window[d] == need[d]: valid -= 1 window[d] -= 1 return result ``` #### 和为 K 的子数组 (Subarray Sum Equals K) 这个问涉及计算一个数组中有多少个连续子数组其元素总和恰好等于 k 值。通过前缀和以及字典存储中间状态可达到线性时间效率。 ```python def subarraySum(nums, k): count = total_sum = 0 sums_dict = {0: 1} for num in nums: total_sum += num if (total_sum - k) in sums_dict: count += sums_dict.get(total_sum - k, 0) sums_dict[total_sum] = sums_dict.get(total_sum, 0) + 1 return count ``` 以上仅展示了部分 HOT 100 列表内的经典习及其基于 Python 实现的核心逻辑。更多具体案例可通过链接访问官方文档获取进一步学习资料[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值