当前位置: 首页 > news >正文

[贪心算法]买卖股票的最佳时机 买卖股票的最佳时机Ⅱ K次取反后最大化的数组和 按身高排序 优势洗牌(田忌赛马)

1.买卖股票的最佳时机

在这里插入图片描述

暴力解法就是两层循环,找出两个差值最大的即可。 优化:在找最小的时候不用每次都循环一遍,只要在i向后走的时候,每次记录一下最小的值即可

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n=prices.size();
        int ret=0;
        for(int i=0,prevMin=INT_MAX;i<n;i++)//i是卖的那一天
        {
            //1.先更新结果
            ret=max(ret,prices[i]-prevMin);
            //2.更新最小值
            prevMin=min(prices[i],prevMin);
        }
        return ret;
    }
};

2.买卖股票的最佳时机Ⅱ

在这里插入图片描述
在这里插入图片描述

只需要在每次上升到最高点的时候卖掉即可,这样+起来的总和就是最高利润;

  • 当prices[j+1]>prices[j] 时,就让j++
  • 走到prices[j+1]<prices[j]就让,i++,j=i 继续向后寻找,直到出现prices[j+1]>prices[j]
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n=prices.size();
        int ret=0;
        for(int i=0;i<n;i++)
        {
            int j=i;
            while(j+1<n && prices[j+1]>prices[j])
                j++;
            ret+=prices[j]-prices[i];

            i=j;
        }
        return ret;
    }
};

3.K次取反后最大化的数组

在这里插入图片描述
我们设m是整个数组中负数的个数,那么就根据m和k的大小进行分类讨论

  • m>k (先排序)反转前k个数,再相加
  • m==k 把所有的数都当成正数加起来
  • m<k
  •    1.当k-m是偶数时,就和m==k情况相同
    
  •      2.当k-m是奇数时,把绝对值最小的那个数变成负数即可
    
class Solution {
public:
    int largestSumAfterKNegations(vector<int>& nums, int k) {
        int m = 0;
        int minElm = INT_MAX;
        for (int i = 0; i < nums.size(); i++) {
            if (nums[i] < 0)
                m++;
            minElm = min(minElm, abs(nums[i]));
        }
        int ret = 0;
        // 分类讨论
        if (m > k) {
            sort(nums.begin(), nums.end());
            for (int i = 0; i < k; i++) {
                ret += abs(nums[i]);
            }
            for (int i = k; i < nums.size(); i++) {
                ret += nums[i];
            }
        } else if (m == k) {
            for (int i = 0; i < nums.size(); i++)
                ret += abs(nums[i]);
        } else {
            if ((k - m) % 2 == 0) // 偶数
            {
                for (int i = 0; i < nums.size(); i++)
                    ret += abs(nums[i]);
            }
            else
            {
                for (int i = 0; i < nums.size(); i++)
                    ret += abs(nums[i]);
                ret=ret-2*minElm;
            }
        }
        return ret;
    }
};

4.按身高排序

在这里插入图片描述

  1. 创建一个下标数组
  2. 仅需对下标数组排序(根据身高进行排序规则的改变)
  3. 根据下标找到对应的字符串 在这里插入图片描述
class Solution {
public:
    vector<string> sortPeople(vector<string>& names, vector<int>& heights) {
        //创建一个数组下标
        int n=heights.size();
        vector<int> v(n);
        for(int i=0;i<n;i++)
            v[i]=i;
        //重写sort的比较方法
        sort(v.begin(),v.end(),[&](int i,int j)
        {
            return heights[i]>heights[j];
        });
        //通过下表找到响应的字符串
        vector<string> ret;
        for(int i:v)
        {
            ret.push_back(names[i]);
        }
        return ret;
    }
};

优势洗牌(田忌赛马)

在这里插入图片描述

排序(贪心)

  1. 最差的能比过就直接比
  2. 比不过就去跟对面最大的比,废物利用最大化

步骤:
先对两个数组排序,然后用贪心的思想去排序,这样出来的结果和题目的实例是不一样的;
原因就在于题目的nums2没有排序,所以我们就要用到身高那一题的思想用下标数组来解决,
创建一个index数组,数组的排序规则就是比较nums2中的大小,然后再index数组中创建一个left和right用来记录最大值和最小值

class Solution {
public:
    vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) {
        int n=nums2.size();
        vector<int> ret(n);//存放结果
        vector<int> index(n);//下标数组
        for(int i=0;i<n;i++)
        {
            index[i]=i;
        }
        sort(nums1.begin(),nums1.end());
        //下标数组排序
        sort(index.begin(),index.end(),
            [&](int p1,int p2){
                return nums2[p1]<nums2[p2];
            });
        //记录index的左右两边
        int left=0,right=n-1;
        for(int i=0;i<n;i++)
        {
            //贪心:比得过就比,比不过就跟最大的比
            if(nums1[i]>nums2[index[left]])
            {
                ret[index[left++]]=nums1[i];
            }
            else
            {
                ret[index[right--]]=nums1[i];
            }
        }
        return ret;
    }
};

相关文章:

  • 基础篇结束纪念——Java抽象类 模板类 static接口
  • 基于springboot的校园周边美食探索及分享平台(021)
  • 基于生成对抗网络(GAN)的图像超分辨率重建:技术与应用
  • 【深度】JADC2的层级结构以及全域Mesh网络
  • K8S集群新增和删除Node节点(K8s Cluster Adds and Removes Node Nodes)
  • 【动态规划】矩阵连乘问题 C++(附代码实例和复杂度分析)
  • 3. 轴指令(omron 机器自动化控制器)——>MC_SetOverride
  • react 常用插件
  • axios 请求的底层依赖是什么?
  • 系统思考—啤酒游戏经营决策沙盘模拟
  • 牛客网编程题调试问题(华为研发工程师编程题JavaScript Node调试)
  • C++ - 从零实现Json-Rpc框架-1(JsonCpp Muduo 异步操作)
  • 【Linux】统信操作系统进入单用户如何修改密码
  • SQL 通配符
  • 大白话详细解读React框架的diffing算法
  • Python+selenium,轻松搭建Web自动化测试框架
  • 【Unity Bug 随记】使用Rider debug功能时Unity Reload Domain卡死问题
  • Android 关于compose的一些坑和理解
  • 批量文件分析器:使用Python从PPT和PDF中提取文本
  • 广度优先搜索(BFS) vs 深度优先搜索(DFS):算法对比与 C++ 实现
  • 布吉做棋牌网站建设哪家便宜/如何做推广最有效果
  • 网站建设语言/在线排名优化
  • 吴江建设局网站打不开了/动态网站建设
  • 成都疫情为什么不公开了/电商网站seo优化
  • 做app网站的软件叫什么名字/网络营销专业代码
  • 网站页面用什么软件做/自己怎么免费做网站