贪心策略(一)(选择排序、分割平衡串、买卖股票、跳跃游戏)

news2024/10/7 18:25:58

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。


贪心选择是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素。

一、选择排序

二、分割1221. 分割平衡字符串

三、买卖股票的最好时机(二)

四、55. 跳跃游戏


一、选择排序

选择排序是一种使用了贪心策略的算法,它确保每一次"遍历"都可以保证一个元素处于对应位置上.
每次选择一个最小或者最大的元素放在对应的位置上

    void SelectSort(vector<int> num)
	{
		int n = num.size();
		for (int i = 0; i < n; i++)
		{
			int Index = i;
            // 用Index持续标记当前最小元素
			for (int j = i; j < n; j++)
			{
				if (num[j] < num[Index])
					Index = j;
			}
			swap(num[i], num[Index]);
		}
		Print(num);
	}
    
	void Print(vector<int> num)
	{
		for (auto e : num)
			cout << e << " ";
		cout << endl;
	}

二、分割1221. 分割平衡字符串

平衡字符串 中,'L' 和 'R' 字符的数量是相同的。

给你一个平衡字符串 s,请你将它分割成尽可能多的子字符串,并满足:

每个子字符串都是平衡字符串。

返回可以通过分割得到的平衡字符串的 最大数量 。

 【解法一】动态规划思想根深蒂固之后,我就变得顾头顾尾了……

最终写下了下面这个代码,这个结果也异常醒目哈哈哈哈,忍不住炫耀一手

, 主要还是没有注意到题目给出的是一个已经平衡了的字符串,我还对j~i之间的区域进行判断

class Solution {
public:
    bool Isbalance(string s)
    {
        int countL = 0;
        int countR = 0;
        int n = s.size();
        for (int i = 0; i < n; i++)
        {
            if (s[i] == 'L')
                countL++;
            else
                countR++;
        }
        return countL == countR;
    }
    int balancedStringSplit(string s) {
        int n = s.size();
        vector<int> dp(n+1, 1);
        for(int i = 1; i < n; i+=2)
        {
            for(int j = 1; j < i; j+=2)
            {
                int len = i-j;
                string temp = s.substr(j+1, len);
                if(dp[j] && Isbalance(temp))
                    dp[i] = max(dp[i], dp[j]+1);
            }
        }
        return dp[n-1];
    }
};

【解法二】使用俩个计数器即可,一个用来返回结果,一个用来验证是否平衡,如果遇到L那么balance++,如果遇到R那么balance--;如果balance为0,那么说明L==R所以进行一次分割,不需要管后面元素的情况(后面肯定是平衡的)

class Solution {
public:
    int balancedStringSplit(string s) {
        int cnt = 0;
        int balance = 0;
        for(int i = 0; i < s.size(); i++)
        {
            if(s[i] == 'L')
                balance++;
            else
                balance--;
            if(!balance)cnt++;
        }
        return cnt;
    }
};

【解法三】使用三目运算符优化一手

class Solution {
public:
    int balancedStringSplit(string s) {
        int res = 0;
        int bal = 0;
        for(int i = 0; i < s.size(); i++)
        {
            s[i]=='L' ? bal++ : bal--;
            if(!bal)res++;
        }
        return res;
    }
};

三、买卖股票的最好时机(二)

122. 买卖股票的最佳时机 II

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。

返回 你能获得的 最大 利润 。

 【解法一】使用动态规划,之前的博客中以及详细处理了买卖股票的(一、二、三版本)这里直接手撕代码

俩个状态分别为第i天持股股最大值与第i天不持股的最大值。

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        vector<vector<int>> dp(n, vector<int> (2));
        dp[0][0] = -prices[0];
        dp[0][1] = 0;
        for(int i = 1; i < n; i++)
        {
            dp[i][0] = max(dp[i-1][0], dp[i-1][1]-prices[i]);
            dp[i][1] = max(dp[i-1][1], dp[i-1][0]+prices[i]);
        }
        return dp[n-1][1];
    }
};

【解法二】贪心策略

这种题解类似于一种马后炮的感觉,在现实生活中可能有这种情况嘛?好比我今天才知道了昨天阿根廷输了那么又无法改变自己昨天已经花了几十大洋买了阿根廷一样。

上面都是题外话,这里的贪心策略,更加注重的是每一天的盈利,假使只要第二天能赚钱我就卖掉,然后买新的,算当天的盈利,如果第二天下跌那就不算我的盈利。(真是够贪心的)

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int profit = 0;
        for(int i = 1; i < prices.size(); i++)
           // 如果第二天上涨,那么就在第一天买
           if(prices[i] > prices[i-1])
               profit += prices[i] - prices[i-1];
        return profit;
    }
};

四、55. 跳跃游戏

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标。

 也是一个贪心策略思想哈,每走一步都看自己当前这一步所能达到题目要求的最大长度。

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int max = nums[0];
        int n = nums.size();
        if(n==1)return true;    // 只有一个元素直接返回true
        for(int i = 1; i <= max; i++)
        {
            int pos = i+nums[i];    // 记录当前结点所能到达的最远位置
            max = pos>max?pos:max;  // 更新max
            if(max >= n-1)      // 如果max可以到达最远位置返回true
                return true;
        }
        return false;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/169338.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4、Ubuntu20常用操作_文本编辑文件系统目录和文件操作用户管理和文件权限

Ubuntu系统操作 注销&#xff08;退出Linux系统&#xff09; 在每次使用完后&#xff0c;一定要进行注销&#xff08;或者说退出&#xff09;&#xff0c;以防他人通过你的帐号进入系统。 在Linux提示符下&#xff0c;运行exit命令&#xff0c;即可退出本次登录 或直接按组…

代码随想录刷题训练营第七天|● 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和 ● 总结

四数相加 看完题后的思路 首先想到了暴力解法,四重for循环,时间复杂度为0(n^4).接着往下想,四数相加不正好是(两数相加)(两数相加)吗,可以依次求出两数相加的结果存入hash表中 和-[下标1,下标2],然后再进行两数相加. 思路 上面的思路中,有两点疑问: (12)(34)(13)(24)吗? 1…

渗透测试基础入门【01】——测试流程(IPC$)

渗透测试基础入门【01】——测试流程&#xff08;IPC$&#xff09; 注意&#xff0c;攻击对方需要对方授权&#xff0c;本文章目的只为教学&#xff0c;不要拿去干违法的事 1 渗透测试流程 授权&#xff08;获取目标用户授权&#xff0c;否则是违法行为&#xff09;信息收集 …

【4 - 降维算法PCA和SVD - 原理部分】菜菜sklearn机器学习

课程地址&#xff1a;《菜菜的机器学习sklearn课堂》_哔哩哔哩_bilibili 第一期&#xff1a;sklearn入门 & 决策树在sklearn中的实现第二期&#xff1a;随机森林在sklearn中的实现第三期&#xff1a;sklearn中的数据预处理和特征工程第四期&#xff1a;sklearn中的降维算法…

nacos注册源码分析

Nacos注册服务 cosumer启动的时候&#xff0c;从nacos server上读取指定服务名称的实例列表&#xff0c;缓存到本地内存中。 开启一个定时任务&#xff0c;每隔10s去nacos server上拉取服务列表 nacos的push机制&#xff1a; 通过心跳检测发现服务提供者出现心态超时的时候…

SpringCloud学习笔记 - 流控规则 - Sentinel

1. Sentinel流控规则简介 这里的流控指的是“流量控制”&#xff0c;进一步解释说明&#xff1a; 资源名&#xff1a;唯一名称&#xff0c;默认请求路径。 针对来源&#xff1a;Sentinel可以针对调用者进行限流&#xff0c;填写微服务名&#xff0c;默认default&#xff08;不…

爬虫解析模块(bs4,selenium)

bs4文档 from bs4 import BeautifulSoupBeautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。Beautiful Soup自动将输入文档转换为Unicode编码&#xff0c;输出文档转换为utf-8编码。 解析器 解析器使用方法优势劣势Python标准库BeautifulS…

Dubbo——入门介绍

目录1.概述1.1.什么是 Dubbo &#xff1f;1.2.Dubbo 架构2.Dubbo 快速入门2.1.Zookeeper 安装2.2.创建项目2.3.代码实现2.3.1.dubbo-service 模块2.3.2.dubbo-web 模块2.4.本地启动2.5.使用 Dubbo 实现 PRC2.5.1.修改 dubbo-service 模块2.5.2.修改 dubbo-web 模块2.5.3.启动 d…

可免费编辑 PDF 内容的 7 大 PDF 编辑工具

有时您可能希望编辑 PDF 文档中的敏感信息&#xff0c;例如财务帐号和 ID 号&#xff0c;以便在不泄露隐私的情况下共享 PDF。编辑 PDF 是从 PDF 中删除私有内容。使用PDF 编辑工具可以轻松完成编辑。市场上有这么多工具&#xff0c;您需要选择最好的一种。 7 大 PDF 编辑工具 …

data analysis and predict

data anlysis and predict 谢邀&#xff0c;本人正在崩溃和兴奋间反复横跳&#xff08;崩溃居多&#xff09;&#xff0c;anyway, 我心态超好的&#xff01;besides, 仅供个人学习查阅&#xff0c;不具任何参考价值&#xff01;&#xff01;&#xff01; &#xff08;小边不想努…

路由信息协议RIP

文章目录路由信息协议RIP一、Routing Information Protocol的定义二、RIP的基本工作过程三、“坏消息传播得慢”的问题四、总结路由信息协议RIP 一、Routing Information Protocol的定义 RIP是分布式的基于距离向量的路由选择协议 协议RIP的特点是&#xff1a; 仅和相邻路由…

Java数据结构(泛型)

1、集合框架 Java 集合框架Java Collection Framework &#xff0c;又被称为容器container &#xff0c;是定义在 java.util 包下的一组接口interfaces 和其实现类classes 。 其主要表现为将多个元素element 置于一个单元中&#xff0c;用于对这些元素进行快速、便捷的存储sto…

【XML了解】xml与hxml 标记语言学习

XML与HXML的区别 XML 被设计用来传输和存储数据&#xff0c;结构化、存储以及传输信息&#xff08;如&#xff1a;数据包&#xff09; XML 被设计用来传输和存储数据&#xff0c;其焦点是数据的内容 XML 标签没有被预定义, 需要自行定义标签 HTML 被设计用来表现和展示数据&…

数组常用方法总结 (7) :copyWithin / fill / reduce / reduceRight

copyWithin 将指定位置的元素复制到数组的其他位置。返回值为移动后数组。原始数组的内容会被改变&#xff0c;原始数组的长度不会改变。arr.copyWithin(index, startIndex, endIndex)第一个参数为&#xff0c;期望被复制的内容将要插入的位置。第二个参数为&#xff0c;数组中…

SpringBoot 参数接收只看这一篇文章就够了

好久没有写过接口了&#xff0c;最近在写一些基础接口&#xff0c;在写参数接口接收参数的时候居然想不起来&#xff0c;会有那么一丝丝的怀疑&#xff0c;虽然并不会影响编码&#xff0c;但是说明一个问题&#xff0c;没有系统的总结知识&#xff0c;没有温故知新&#xff0c;…

PMP真的有用吗?

作为一个考了PMP的前辈来说&#xff0c;是有用的。PMP 含金量&#xff0c;PMP有没有用&#xff0c;这类问题一直是大家关注的重点&#xff0c;知乎上几个相关问题热度也一直很高。友情提示一句&#xff1a;PMP 就是一个证书&#xff0c;能起到加分和门槛的作用&#xff0c;技术…

Diazo Biotin-PEG3-DBCO,二苯并环辛炔PEG3重氮生物素,无铜 Click Chemistry

Diazo Biotin-PEG3-DBCO反应原理&#xff1a;Diazo Biotin-PEG3-DBCO 是一种点击化学标记生物素&#xff0c;可通过无铜 Click Chemistry 与叠氮化物发生反应。重氮允许使用连二亚硫酸钠 (Na2S2O4) 从链霉亲和素中有效释放捕获的生物素化分子。点击化学生物素标记试剂包含各种点…

基于麻雀算法优化的深度极限学习机DLM的预测算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

基于SpringBoot的SSMP整合(业务层表现层)

基于SpringBoot的SSMP整合&#xff08;数据层&#xff09;https://blog.csdn.net/weixin_51882166/article/details/128693739?spm1001.2014.3001.5502 标准CRUD Service层接口定义与数据层接口定义具有较大差距。 定义Service接口&#xff1a; package com.example.ssmp_…

蓝桥杯STM32G431RBT6学习——LCD

蓝桥杯STM32G431RBT6学习——LCD 前言 作为在开发板上最显眼的LCD屏幕&#xff0c;自然而然也是每年的必考考点。国信长天开发板使用的是一块2.4寸&#xff08;240*320&#xff09;的TFT-LCD液晶屏&#xff0c;其引脚占用如下&#xff1a; 其中&#xff0c;CS为片选信号引脚…