您的位置:首页 > 其它

leetcode263_264:Ugly Number & Ugly Number II

2015-08-24 19:56 459 查看

Ugly Number

Write a program to check whether a given number is an ugly number.

Ugly numbers are positive numbers whose prime factors only include 2, 3, 5. For example, 6, 8 are ugly while 14 is not ugly since it includes another prime factor 7.

Note that 1 is typically treated as an ugly number.

解法

判定是否为Ugly Number,一个数如果不出现除2,3,5以外的素数因子,则最终一定归因于1【一直整除2,3,5后的结果】,即Ugly Number=(2^idx2)*(3^idx3)*(5^idx5)【idx2,idx3,idx5>=0】

class Solution {
public:
bool isUgly(int num) {
if (num == 1) return true;
if (num <= 0) return false;
while (num >= 2 && (num % 2 == 0)) num >>= 1;
while (num >= 3 && (num % 3 == 0)) num /= 3;
while (num >= 5 && (num % 5 == 0)) num /= 5;
if (num==1) return true;
else return false;
}
};


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.

解法

找出第n个Ugly Number,由上述分析知道:Ugly Number=(2^idx2)*(3^idx3)*(5^idx5),所以可以把正整数范围内的所有Ugly Number找到后返回第n个顺序统计量【即第n大的数】。

这里主要讲如何找Ugly Number,后面如何线性时间找顺序统计量的问题参考《算法导论》。这里直接对数组排序找到,复杂度O(n*log(n)).

如何找所有Ugly Number,我的思路是先确定idx2,idx3,idx5的最大值:idx2 <= (int)lg(INT_MAX)/lg(2)。根据idx2,idx3,idx5不同取值得到Ugly Number数组。

代码:

//424 ms
class Solution {
public:
int nthUglyNumber(int n) {
if (n == 1) return 1;
int p[10000];
int len = 0;
long long num;
for (int i = 0; i <= 13; i++) {
for (int j = 0; j <= 20; j++) {
for (int k = 0; k <= 30; k++) {
num = pow(5, i)*pow(3, j)*pow(2, k);
if (num > INT_MAX) break;
p[len++] = num;
}
}
}
sort(p, p + len);
return p[n - 1];
}
};


更新

线性时间找顺序统计量下的代码,原理请参考第K顺序统计量的求解

原博中第38行代码错误,应该为int i = low + rand() % (high - low +1);

//280ms
class Solution {
public:
int Partition(int A[], int low, int high)
{
int pivot = A[low];
int i = low;
for (int j = low + 1; j <= high; ++j)
{
if (A[j] <= pivot)
{
++i;
swap(A[i], A[j]);
}
}
swap(A[i], A[low]);
return i;
}

int Randomized_Partition(int A[], int low, int high)
{
srand(time(NULL));
int i = low + (rand() % (high - low + 1));
swap(A[low], A[i]);
return Partition(A, low, high);
}

int Randomized_Select(int A[], int p, int q, int i)
{
if (p == q)
return A[p];
int r = Randomized_Partition(A, p, q);
int k = r - p + 1;
if (i == k)
return A[r];
if (i < k)
return Randomized_Select(A, p, r - 1, i);
else
return Randomized_Select(A, r + 1, q, i - k);
}
int nthUglyNumber(int n) {
if (n == 1) return 1;
int p[20000];
int len = 0;
long long num;
int a = 0, b = 0, c = 0;
for (int i = 0; i <= 13; i++) {
for (int j = 0; j <= 20; j++) {
for (int k = 0; k <= 30; k++) {
num = pow(5, i)*pow(3, j)*pow(2, k);
if (num > INT_MAX) break;
p[len++] = num;
}
}
}
return Randomized_Select(p,0,len-1,n);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: