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

LeetCode -- Ugly Number II

题目描述:
Write a program to find the n-th ugly number.


Ugly numbers are positive numbers whose prime factors only include 2, 3, 5. For example, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 is the sequence of the first 10 ugly numbers.


Note that 1 is typically treated as an ugly number.


本题算是Ugly number 1的扩展问题,求出第n个ugly number。


本题属于数学问题,回顾一下ugly number的定义:因数只包含2,3,5的数和1。






方法一:
基于Ugly number 1中的函数IsUgly,逐个判断从1到n,累计到第n个ugly的number即可。缺点很显然,逐个判断效率非常低。


方法二:


对于任意1个大于2,3,5的ugly number 来说,除以2,3,5后必然仍是ugly number,可使用哈希来缓存ugly number ,每次除以2,3,5判断是否在哈希中有键值。
这种方式使用了大量的空间,并且很多多余的判断浪费在了不是ugly number上。 
本解法依然无法被AC。


实现代码:


public int NthUglyNumber(int n) 
{
	var hash = new Dictionary<int, int>();
	hash.Add(1 , 1);
	hash.Add(2 , 2);
	hash.Add(3 , 3);
	hash.Add(4 , 4);
	hash.Add(5 , 5);
	if(hash.ContainsKey(n)){
		return hash[n];
	}
	var count = 5;
	var n1 = 6;
	while(count < n){
		if(n1 % 2 == 0 && hash.ContainsKey(n1/2) ||
		   n1 % 3 == 0 && hash.ContainsKey(n1/3) ||
		   n1 % 5 == 0 && hash.ContainsKey(n1/5)){
			hash.Add(n1, count);
			count ++;
		}
		n1++;
	}
	
	return hash.Keys.Last();
}






方法三:
1.由于是计算第n个ugly number,那么它一定来自于由2,3,5分别出发的3个序列中的其中某个元素。
2.可使用2,3,5三个变量来记录当前序列出发的最小ugly数,每次取得这3个序列中的最小那个,然后从2,3,5序列取出下一位ugly数。


本实现参考了:
http://www.geeksforgeeks.org/ugly-numbers/
http://www.cnblogs.com/grandyang/p/4743837.html


实现代码:


public class Solution {
    public int NthUglyNumber(int n) 
    {
    	var i2 = 1;
    	var i3 = 1;
    	var i5 = 1;
    	var uglies = new List<int>();
    	uglies.Add(1);
    	while (uglies.Count < n) {
    		var v2 = uglies[i2-1] * 2;
    		var v3 = uglies[i3-1] * 3;
    		var v5 = uglies[i5-1] * 5;
    		
    		int min = Math.Min(v2, Math.Min(v3, v5));
    		if (min == v2) {
    			i2++;
    		}
    		if (min == v3){
    			i3++;
    		}
    		if (min == v5) {
    			i5++;
    		}
    		uglies.Add(min);
    	}
    	return uglies.Last();
    }
}


相关文章:

  • LeetCode -- Ugly Number
  • vim 显示行号、语法高亮、自动缩进的设置
  • LeetCode -- Linked List cycle
  • 根据textbox中的值,改变dropdownlist的选项
  • LeetCode -- Basic Calculator II
  • 完整SQL分页存储过程(支持多表联接)
  • LeetCode -- Bitwise AND of Numbers Range
  • C 符号列表
  • LeetCode -- Linked List Cycle II
  • LeetCode -- LRU Cache
  • [Web 开发] 定制IE下载对话框的按钮(打开/保存)
  • LeetCode -- Min Stack
  • SQL2005CLR函数扩展-繁简转换
  • LeetCode -- Minimum Size Subarray Sum
  • LeetCode -- Number of 1 Bits
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • bearychat的java client
  • docker-consul
  • Facebook AccountKit 接入的坑点
  • Go 语言编译器的 //go: 详解
  • Java Agent 学习笔记
  • javascript 哈希表
  • MYSQL 的 IF 函数
  • Mysql优化
  • Vue ES6 Jade Scss Webpack Gulp
  • Zsh 开发指南(第十四篇 文件读写)
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 分布式事物理论与实践
  • 给Prometheus造假数据的方法
  • 基于组件的设计工作流与界面抽象
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 前端面试总结(at, md)
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 一起参Ember.js讨论、问答社区。
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #Z0458. 树的中心2
  • (13)Hive调优——动态分区导致的小文件问题
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (javascript)再说document.body.scrollTop的使用问题
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (二)pulsar安装在独立的docker中,python测试
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (转)Google的Objective-C编码规范
  • (转)负载均衡,回话保持,cookie
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET Core中Emit的使用
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值