33 丑数

题目描述

把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

丑数只能被2,3,5整除,所以我们一直除以2,一直除以3,一直除以5 ,如果最后等于1就是丑数

解法1:暴力 超时了 最后。

 1 public class Solution {
 2     public int GetUglyNumber_Solution(int index) {
 3         int ug_cnt=0;
 4         int num =1;
 5         while(ug_cnt<index){
 6             if(isUgly(num)) ug_cnt++;
 7             num++;
 8         }
 9         return num;
10     }
11     private boolean isUgly(int num){
12         while(num %2== 0 )
13             num/=2;
14         while(num %3 == 0 )num/=3;
15         while(num %5== 0 )
16             num/=5;
17         return num==1;
18     }
19 }

解法2:

把前面已经是丑数的数保存起来。

创建一个数组,数组里面的丑数是排好序的,每一个丑数都是前面的丑数乘以2,3,5得到的。

对于乘以2,肯定存在某个丑数T2,排在它之前的每一个丑数乘以2得到的结果都会小于已有的最大的丑数,

排在T2之后的都太大。

语法问题:

int t2=0,t3=0,t5 =0;//t2,t3,t5都是下标

int t2,t3,t5 =0;//错误Java不会默认的初始化为0
 1 import java.util.ArrayList;
 2 import java.lang.Math;
 3 public class Solution {
 4     public int GetUglyNumber_Solution(int n) {
 5         if(n<=0) return 0;
 6         ArrayList<Integer> list = new ArrayList<Integer>();
 7         list.add(1);
 8         int t2=0,t3=0,t5 =0;//t2,t3,t5都是下标
 9         while(list.size()<n){
10             int min = Math.min(list.get(t2)*2,Math.min(list.get(t3)*3,list.get(t5)*5));
11             list.add(min);
12             if(min==list.get(t2)*2) t2++;
13             if(min==list.get(t3)*3) t3++;
14             if(min==list.get(t5)*5) t5++;
15         }
16         return list.get(list.size()-1);
17     }
18 }

原文地址:https://www.cnblogs.com/zle1992/p/8157989.html

时间: 2024-10-29 00:22:38

33 丑数的相关文章

[剑指offer] 33. 丑数

题目描述 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数.  leetcode原题,题解链接 class Solution { public: int GetUglyNumber_Solution(int index) { if (index < 7) return index; vector<int> res(index); res[0] = 1; in

【剑指Offer】33:丑数

题目描述 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 题解: 1 //所有的丑数分为三种类型 2*i,3*i,5*i ,其中 i是数组中的元素,一开始只有1 2 public static int GetUglyNumber_Solution(int index) { 3 // 0-6的丑数分别为0-6 4 if(index<7) { 5 return in

33、求按从小到大的顺序的第N个丑数

一.题目 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 二.解法 1 public class Solution { 2 public int GetUglyNumber_Solution(int index) { 3 if(index <= 0) 4 return 0; 5 if(index < 7) 6 return index; 7 int[] res =

插入排序的优化【不靠谱地讲可以优化到O(nlogn)】 USACO 丑数

首先我们先介绍一下普通的插排,就是我们现在一般写的那种,效率是O(n^2)的. 普通的插排基于的思想就是找位置,然后插入进去,其他在它后面的元素全部后移,下面是普通插排的代码: 1 #include<iostream> 2 #include<fstream> 3 #include<stdio.h> 4 using namespace std; 5 int a[200000]; 6 int p[200000]; 7 8 int main(){ 9 ios::sync_wi

笔试算法题(20):寻找丑数 &amp; 打印1到N位的所有的数

出题:将只包含2,3,5的因子的数称为丑数(Ugly Number),要求找到前面1500个丑数: 分析: 解法1:依次判断从1开始的每一个整数,2,3,5是因子则整数必须可以被他们其中的一个整除,如果不包含任何其他因子则最终的结果为1: 解法2:小丑数必然是某个大丑数的因子,也就是乘以2,3,或者5之后的值,所以可以利用已经找到的丑数来寻找下一个丑数,使用数组有序保存已经找到的丑 数,并且当前最大丑数值为M:用大于M/2的丑数乘以2得到M1,用大于M/3的丑数乘以3得到M2,用大于M/5的丑数

Save Princess(丑数)

Save Princess 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 Yesterday, the princess was kidnapped by a devil. The prince has to rescue our pretty princess. "OK, if you want to save the beautiful princess, you must answer my questions correctly."the dev

hdu1058丑数(优先队列、暴力打表)

hdu1058 题意:当一个数只有2.3.5.7这四种质因数时(也可以一种都没有或只有其中几种),这个数就是丑数,输出第 n 个丑数是多少: 其实并没有发现hdu把这道题放在 dp 专题里的意图,我的思路就是预处理出丑数数组,然后读入 n 就直接输出第 n 个丑数.我自己又一种想法,询问翔神之后又学到了另一种做法. 我自己的生成数组的方法是:数组的第一个元素定为1,然后用优先队列,首先将2,3,5,7放入优先队列,每次从队列中取出最小的一个数,将它放入数组中,然后分别将它乘上2,3,5,7后放入

[LeetCode]70. Ugly Number II第N个丑数

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

只包含因子2 3 5的数(数论,二分,加丑数思想)

个人心得:这题错了很多很多次,一开始单纯是想一直除2,3,5能除尽就可以了,但是数据太大,从第九组数据开始就超时了. 后面听了队友的意见打表,这里用了丑数的思想,就是从2,3,5开始依次取出最小的数分别乘以2,3,5若不存在就放进优先队列, 当然要用set就行存储,s.count()就是查找是否存在的函数,可惜还是超时了,应该是stl中的lower_bound函数效率太低, 没办法就只能用另外的数组存储然后自己根据二分写查找函数,后面对longlong进行适当的输出就过了. 题目: K的因子中只