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. C# RichTextBox实现背景透明

    这几天在做一个文本编辑器,要将RichTextBox的背景透明,但是发现C#的RichTextBox是不支持将背景设置为Transparent(透明). 网上找了好多方法,但都不行. 后来自己想了个办 ...

  2. js面向过程 分页功能

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. tomcat8.5优化配置

    参考文章: https://www.cnblogs.com/steven-snow/p/9262025.html 1.Tomcat内存使用调整 windows系统在bin/catalina.bat文件 ...

  4. linx下跑多个tomcat

    1.修改server.xml文件 <Server port="8005" shutdown="SHUTDOWN"> <Connector po ...

  5. Mybatis plus中一个框多条件查询 SQL拼接

    遇到多条件查询时,只用框架自带的方法搞不定,只能自己写方法拼接 EntityWrapper<YcejShopEntity> wrapper = new EntityWrapper<& ...

  6. 每天进步一点点------Sobel算子(1)

    void MySobel(IplImage* gray, IplImage* gradient) { /* Sobel template a00 a01 a02 a10 a11 a12 a20 a21 ...

  7. TestNG单元测试与使用详解

    TestNG的基本注解与执行顺序 在类里编辑程序时,在@Test后面,摁 alt+回车,选择对应的插件,可以把目前用到的插件自动添加到 pom.xml 文件中,如下面的testng,每摁一次,就多添加 ...

  8. redis-start

    start CAP BASE: 基本可用 Basically Available 软状态 Soft state 最终一致 Eventually consistent Redis:REmote DIct ...

  9. 红帽RHCE培训-课程2笔记目录

    目录 1 kickstart自动安装 DHCP+TFTP(syslinux) +FTP +KICKSTART ~/anaconda-ks.cfg system-config-kickstart 2 g ...

  10. GitBook的账号注册和安装使用(一)

    1.GitBook账号注册 GitBook原注册地址  https://legacy.gitbook.com/join 改为: https://www.gitbook.com/ (1)注册账号:htt ...