枚举算法-day2

1.买股票的最佳时机

题目

解析

  • 记录最小值,然后遍历即可

代码

cpp 复制代码
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        // 时间复杂度:O(n)
        // 空间复杂度:O(1)

        int n = prices.size();
        int ans = 0;

        int min_price = prices[0];
        for(int j = 1;j < n;j ++){
            ans = max(ans,prices[j] - min_price);
            min_price = min(min_price,prices[j]);
        }

        return ans;
    }
};

2.数位和相等数对的最大和

题目

解析

  • 哈希表中,键值对:对应数位和中最大的数;每次更新答案需要更新该数位和最大的数;

代码

cpp 复制代码
class Solution {
    int f(int x){ // 计算 x 的数位和
        int sum = 0;
        while(x){
            sum += x % 10;
            x /= 10;
        }
        return sum;
    }

public:
    int maximumSum(vector<int>& nums) {
        // 时间复杂度:O(nlog U),U 为 max(nums)
        // 空间复杂度:O(log n)

        int n = nums.size();
        int ans = -1;

        unordered_map<int,int> cnt;

        for(int j = 0;j < n;j ++){
            auto it = cnt.find(f(nums[j]));// 寻找前面有没有相同数位和的数
            if(it != cnt.end()){
                ans = max(ans,it -> second + nums[j]);
            }
            cnt[f(nums[j])] = max(nums[j],cnt[f(nums[j])]);// 相同数位和保留最大的
        }

        return ans;
    }
};

3.数组中的最大数对和

题目

解析

  • 同理可得;

代码

cpp 复制代码
class Solution {
    int f(int x){
        int ans = 0;
        while(x){
            ans = max(ans,x % 10);
            x /= 10;
        }
        return ans;
    }

public:
    int maxSum(vector<int>& nums) {
        // 时间复杂度:O(nlog U)
        // 空间复杂度:O(n)

        int n = nums.size();
        int ans = -1;

        unordered_map<int,int> cnt;

        for(int j = 0;j < n;j ++){
            auto it = cnt.find(f(nums[j]));
            if(it != cnt.end()){
                ans = max(ans,it -> second + nums[j]);
            }
            cnt[f(nums[j])] = max(cnt[f(nums[j])],nums[j]); 
        }   

        return ans;
    }
};

4.K 和数组对的最大数目

题目

解析

  • 用哈希表记录每个数的个数,而当 target 没有数的时候,必须 erase ;

代码

cpp 复制代码
class Solution {
public:
    int maxOperations(vector<int>& nums, int k) {
        // 时间复杂度:O(n)
        // 空间复杂度:O(n)

        int n = nums.size();
        int ans = 0;

        unordered_map<int,int> cnt;

        for(int j = 0;j < n;j ++){
            auto it = cnt.find(k - nums[j]);

            if(it != cnt.end()){ // 找到了
                ans ++;
                cnt[k - nums[j]] --;
                if(cnt[k - nums[j]] == 0) cnt.erase(k - nums[j]);// 减到 0 了
            }else { // 没找到
                cnt[nums[j]] ++;
            }
        }

        return ans;
    }
};
相关推荐
海石10 小时前
1500分的题目,确实有实力,不过还是我略胜一筹
算法·leetcode
海石10 小时前
【记忆化搜索】条条大路通AC,走好适合你的那一条,走到后再考虑走得快
算法·leetcode
Jerry12 小时前
LeetCode 151. 反转字符串中的单词
算法
gugucoding12 小时前
31. 【C语言】堆栈与队列的实现
c语言·开发语言·数据结构·链表
ChaoZiLL14 小时前
我的数据结构3——链表(link list)
数据结构·链表
a11177614 小时前
LM 算法迭代过程动画演示(SLAM)
算法
头茬韭菜14 小时前
Context 的生死抉择:四层压缩、截断算法与 Session Memory
算法·ai
Jerry14 小时前
LeetCode 541. 反转字符串 II
算法
Jerry15 小时前
LeetCode 344. 反转字符串
算法
搞科研的小刘选手15 小时前
【香港大学主办&IEEE出版】第六届计算机视觉、应用与算法国际学术会议(CVAA 2026)
算法·计算机视觉·应用·学术会议