Leetcode第12题,整数转罗马数字,难度中等

整个题目比较好理解,难度也不大,就算不过脑子,用一串if也基本上可以解决问题,比如

    /** 执行用时:6ms,在所有 Java 提交中击败了52.61%的用户 内存消耗:40.3 MB, 在所有 Java 提交中击败了5.00%的用户 */
public String intToRoman(int num) {
StringBuilder sb = new StringBuilder();
if(num < 1 || num > 3999) return "";
int n = 0;
if(num >= 1000){
n = num / 1000;
num = num - n * 1000;
for(int i = 0; i < n; i++) sb.append("M");
}
if(num >= 900){
sb.append("CM");
num = num - 900;
}
if(num >= 500){
sb.append("D");
num = num - 500;
}
if(num >= 400){
sb.append("CD");
num = num - 400;
}
if(num >= 100){
n = num / 100;
num = num - n * 100;
for (int i = 0; i < n; i++) sb.append("C");
}
if(num >= 90){
sb.append("XC");
num = num - 90;
}
if(num >= 50){
num = num - 50;
sb.append("L");
}
if(num >= 40){
sb.append("XL");
num = num - 40;
}
if(num >= 10){
n = num / 10;
num = num - n * 10;
for (int i = 0; i < n; i++) sb.append("X");
}
if(num >= 9){
sb.append("IX");
num = num - 9;
}
if(num >= 5){
num = num - 5;
sb.append("V");
}
if(num >= 4){
sb.append("IV");
num = num - 4;
}
if(num >= 1){
n = num / 1;
for (int i = 0; i < n; i++) sb.append("I");
}
return sb.toString();
}

不过这样写if太多了,篇幅太长,整理成数组会好很多:

    /**
执行用时:6 ms, 在所有Java提交中击败了52.61%的用户
内存消耗:40.6 MB, 在所有 Java 提交中击败了5.00%的用户
*/
public String intToRoman2(int num) {
StringBuilder sb = new StringBuilder();
String[][] list = {{"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"},
{"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"},
{"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"},
{"", "M", "MM", "MMM"}};
sb.append(list[3][num/1000]);
sb.append(list[2][num%1000/100]);
sb.append(list[1][num%100/10]);
sb.append(list[0][num%10]);
return sb.toString();
}

这里要注意数组第一位是空字符串,因为有个0,我写的时候忘了这茬,还是看来网友的解题思路才想起的,

那么这两个解题思路都是比较局限性的解题思路,看了题解里大神的分析,想起来原来这题适用贪心算法

具体实现方法:

/**
执行用时:7ms,在所有Java提交中击败了33.11%的用户
内存消耗:40.8MB,在所有Java提交中击败了5.00%的用户
*/
public String intToRoman3(int num) {
int[] nums = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
String[] strs = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
StringBuilder sb = new StringBuilder();
int n = 0;
while(n < 13){
while(num >= nums[n]){
sb.append(strs[n]);
num -= nums[n];
}
n++;
}
return sb.toString();
}

代码的逻辑还是很好理解的,既然用到的贪心算法,趁热打铁去leetcode多搜几道

比如455.分发饼干

/*
执行用时 :8 ms, 在所有 Java 提交中击败了99.61%的用户
内存消耗 :41.8 MB, 在所有 Java 提交中击败了5.14%的用户
*/
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int l = s.length - 1;
int r = 0;
for(int i = g.length - 1; i >= 0; i--){
if(l < 0) return r;
if(g[i] <= s[l]){
r++;
l--;
}
}
return r;
}

这里使用贪心算法,思路就是在当前范围下先解决吃的最多的,然后递归,就可以了

leetcode还有一道中等难度的贪心算法,就是452.用最少数量的箭引爆气球

经过之前几道贪心算法的历练,我觉得首先要在题目中找到局部最优解,那有最优就有对比,所以首先找到比对的对象,像上面的分发饼干,比对的就是孩子的胃口,所以以胃口进行排序,先解决最大的,这道气球题,根据题目,是以x轴排序,那么对比的就是x轴上的位置,因为位置是从0开始的,所以从最小的开始是最优解

if(points==null||points.length==0)return 0;
int r=1;
Arrays.sort(points, Comparator.comparingInt(o->o[1]));
int end=points[0][1]; for(int i=0;i<points.length;i++){
if(points[i][0]<=end)continue;
r++;
end=points[i][1];
}
return r;

把气球按照x轴位置排序,从最左边的气球开始,把箭从最左边气球的最左边擦边过,这样射完所有能射的气球后,第二支箭就从剩下气球里最左边的开始射,以此往复。

从图上来看(这图从leetcode官方拷贝)



从左边的绿球开始扎,那么从6射,可以射到两个绿+红,剩下的气球里最左边的是黄色的,那么从黄色的最右边也就是12射,可以射到两只,射完后气球就没了,那么箭数就是2。

贪心算法和动态规划有点像,不过简单很多。。。

Leetcode 12,452,455-贪心算法的更多相关文章

  1. 【Leetcode】买卖股票-贪心算法

    题目: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必 ...

  2. C#LeetCode刷题-贪心算法

    贪心算法篇 # 题名 刷题 通过率 难度 44 通配符匹配   17.8% 困难 45 跳跃游戏 II   25.5% 困难 55 跳跃游戏   30.6% 中等 122 买卖股票的最佳时机 II C ...

  3. LEETCODE —— Best Time to Buy and Sell Stock II [贪心算法]

    Best Time to Buy and Sell Stock II Say you have an array for which the ith element is the price of a ...

  4. 基于贪心算法的几类区间覆盖问题 nyoj 12喷水装置(二) nyoj 14会场安排问题

    1)区间完全覆盖问题 问题描述:给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖 样例: 区间长度8,可选的覆盖线段[2,6],[1, ...

  5. Algorithm - 贪心算法使用场景 ( LEETCODE —— Best Time to Buy and Sell Stock II)

    先看一道leetcode题: Best Time to Buy and Sell Stock II Say you have an array for which the ith element is ...

  6. LeetCode解题记录(贪心算法)(一)

    1. 前言 目前得到一本不错的算法书籍,页数不多,挺符合我的需要,于是正好借这个机会来好好的系统的刷一下算法题,一来呢,是可以给部分同学提供解题思路,和一些自己的思考,二来呢,我也可以在需要复习的时候 ...

  7. LeetCode解题记录(贪心算法)(二)

    1. 前言 由于后面还有很多题型要写,贪心算法目前可能就到此为止了,上一篇博客的地址为 LeetCode解题记录(贪心算法)(一) 下面正式开始我们的刷题之旅 2. 贪心 763. 划分字母区间(中等 ...

  8. leetcode 贪心算法

    贪心算法中,是以自顶向下的方式使用最优子结构,贪心算法会先做选择,在当时看起来是最优的选择,然后再求解一个结果的子问题. 贪心算法是使所做的选择看起来都是当前最佳的,期望通过所做的局部最优选择来产生一 ...

  9. Leetcode题目55.跳跃游戏(贪心算法-中等)

    题目描述: 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出: ...

随机推荐

  1. AC3 bit allocation

    1.bit allocation overview bit allocation通过分析audio 信号的频谱envelop,使用masking effect来确定使用多少bit来表示频率系数的man ...

  2. 迎娶白富美,走上人生巅峰(python爬虫股票分析)

    一.姿势储备 股票交易,线性代数(分析股票),分位数(风险评估)... finace.yahoo.com 雅虎提供几乎所有股票api www.kaggle.com  有问题找社区 未完待续.....

  3. 搭建私人通讯录/日历同步服务_使用cardDAV/calDAV服务

    搭建私人通讯录/日历同步服务_使用cardDAV/calDAV服务 转载注明来源: 本文链接 来自osnosn的博客,写于 2020-02-18. Radicale, Radicale (对cardd ...

  4. 喵星之旅-狂奔的兔子-基于docker的rabbitmq安装

    docker安装参考:喵星之旅-狂奔的兔子-docker安装和基本使用 一.查询镜像名称 由于我们要安装的是有web管理页面的,不能直接拉取,需要指定版本. 登录docker仓库查询:https:// ...

  5. ftrace使用

    前段时间遇到个问题,有个后继音频数据处理线程调度不及时导致音频输出延迟,音视频不同步. 因此从系统上入手,采用ftrace进行debug,来看有哪些线程会去抢占音频数据处理线程. ftrace 提供了 ...

  6. 【C语言】在有序数组中插入一个数,保证它依然有序

    #include<stdio.h> int main() { ] = { ,,,,,, }; int key, i, j; printf("请输入一个数\n"); sc ...

  7. Maven工程pom中定义jdk版本

    今天把之前做的项目导进eclipse,然后发现报错,一些类在1.6中不支持,需要将JDK版本设置为1.7,我直接通过eclipse中的提示进行更改,然后update project一下,发现又回到了S ...

  8. Innovus update_io_latency

    在Innovus中从ccopt 后的timing report中可以看到clock delay是从负值开始算起的,这个是因为在ccopt过程中进行了的update latency的动作. 基于bloc ...

  9. JS数组删除

    --------------let items=['a','1',0,2,100,null,NaN,undefined,]; -------------要求以上数据执行后输出['1',0,2,100] ...

  10. 01-书城http状态405-此url不支持http方法get

    错误: http状态405-此url不支持http方法get 原因: