丑数
题目描述
把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
这道题有两个版本,一个是简单版,这个版本思路非常简单,但是时间复杂度高,无法过关。
简单版代码如下:
class Solution { public: int GetUglyNumber_Solution(int index) { if ( index <= 0 ) return 0 ; int count = 0 ; int sumOfUgly = 0 ; while ( sumOfUgly <= index ) { count += 1 ; if ( isUgly( count ) ) { sumOfUgly++ ; } } return count ; } bool isUgly( int n ) { while ( n % 2 == 0 ) { n /= 2 ; } while ( n % 3 == 0 ) { n /= 3 ; } while ( n % 5 == 0 ) { n /= 5 ; } return n == 1 ? true : false ; } };
复杂版就要用指针控制了,其实思路也不复杂,以空间换时间。
复杂版代码如下:
class Solution { public: int GetUglyNumber_Solution(int index) { if ( index <= 0 ) return 0 ; int* arr = new int[index] ; arr[0] = 1 ; int* multi2 = arr ; int* multi3 = arr ; int* multi5 = arr ; int nextIndex = 1 ; while ( nextIndex < index ) { int min = MIN( (*multi2) * 2, (*multi3) * 3, (*multi5) * 5 ) ; arr[nextIndex] = min ; while ( *multi2 * 2 <= min ) multi2++ ; while ( *multi3 * 3 <= min ) multi3++ ; while ( *multi5 * 5 <= min ) multi5++ ; nextIndex++ ; } int result = arr[nextIndex - 1] ; if ( arr != NULL ) delete[] arr ; return result ; } int MIN( int n1, int n2, int n3 ) { int tmp = n1 < n2 ? n1 : n2 ; return tmp < n3 ? tmp : n3 ; } };
有两个地方要注意:
1.
int result = arr[nextIndex - 1] ;
写成
int result = arr[nextIndex - 1] ;
是错误的,nextIndex要回退一个步长。
2.函数结束前delete指针时我一开始这样写的:
if ( arr != NULL ) delete[] arr ; if ( multi2 != NULL ) delete multi2 ; if ( multi3 != NULL ) delete multi3 ; if ( multi5 != NULL ) delete multi5 ;
这四个指针指向的同一个内存空间
if ( arr != NULL ) delete[] arr ;
已经归还了内存,但是我还delete了multi2、multi3、multi5,导致同一块内存释放了三次,这无法通过编译。
时间: 2024-10-10 12:51:20