面试题49. 丑数
说实话,那个三指针技巧性太高,如果不是碰到过,大部分人应该是想不到的。
介绍一下我的老实巴交解法,性能一般般,但是胜在简单易懂。
首先在动态数组里插入一个1,然后循环取元素a,将2a,3a,5a插入动态数组。
这里使用的是自定义的二分插入,有相同的元素的时候不插入直接返回。
第n个元素就是所求的结果。
func insert(nums[]int,n int) []int {
l:=0
r:= len(nums)
if n<=nums[l]{
nums=append([]int{n},nums...)
return nums
}
if n>=nums[r-1]{
nums=append(nums,n)
return nums
}
var m int
for l<r-1{
m=(l+r)/2
if n>nums[m]{
l=m
}else if n<nums[m]{
r=m
}else{
return nums
}
}
tmp:=make([]int,l+1)
copy(tmp,nums[:l+1])
tmp=append(tmp,n)
nums=append(tmp,nums[l+1:]...)
return nums
}
func nthUglyNumber(n int) int {
nums:=[]int{1}
for i:=0;i< len(nums);i++{
if i==n-1{
return nums[n-1]
}
nums= insert(nums, nums[i]*2)
nums= insert(nums, nums[i]*3)
nums= insert(nums, nums[i]*5)
}
return 1
}