剑指offer_丑数查找

题目描述

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

解题思路

  1. 既然是只包含2/3/5通全城的丑数,那么这些数字必然是丑数乘以2/3/5上去的,我们可以声明一个数组result大小为index+1(保证下标和index对齐),然后result[1]表示第一个丑数就是1。
  2. 然后我们需要根据已知丑数去求未知丑数,并且是有序的,那么规则就是只需要求得未出现的最小丑数即可
  3. 因为需要对每个丑数都进行乘以2乘以3和乘以5的操作,那么就可以设置三个索引变量,然后分别将当前索引对应的值乘以2乘以3和乘以5进行比较得到最小的即可
  4. 之后需要更新2/3/5对应的索引需要将其索引对应的值乘以相应的因子和当前已经加入到数组的数据进行比较,如果比这个数小那么需要一直更新到大于等于这个数,有点类似快排里面的查找过程
假设当前索引

更新后的索引

Java源代码

public class Solution {
    public int GetUglyNumber_Solution(int index) {
        if (index <= 0) return 0;
        int[] result = new int[index+1];
        result[0]=0;
        result[1]=1;
        int index2 = 1;
        int index3 = 1;
        int index5 = 1;
        int indexNext = 2;
        while (indexNext <= index) {
            int min_val = Math.min(result[index2]*2, Math.min(result[index3]*3, result[index5]*5));
            result[indexNext] = min_val;
            while(result[index2]*2<=result[indexNext]) index2++;
            while(result[index3]*3<=result[indexNext]) index3++;
            while(result[index5]*5<=result[indexNext]) index5++;
            indexNext++;
        }
        return result[index];
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容