剑指Offer 丑数 Java

本文介绍了一种高效算法,用于寻找第N个丑数,即仅包含质因子2、3和5的数。通过动态规划原理,利用已知丑数生成新的丑数,避免了对非丑数的判断,实现空间换时间的优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

**

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

**

  • 丑数的特点:当可以被2、3、5 整除时 一直可以除到1为止 可以的话 就是丑数
  • 根据规则:丑数都是可以由比当前小的丑数*2/3/5得到
  • 所以丑数数组可以 由已经存在在数组的丑数生成
  • 下标为i的丑数元素 乘以2 3 5结果选择最小的 以满足使得丑数从小到大排序
  • 特点:空间换时间 暴力破解的话 需要对非丑数也进行判断 本方法不需要
public class Solution {
    public int GetUglyNumber_Solution(int index) {
        if(index==0)
            return 0;
         int[] uArr=new int[index];
       uArr[0]=1;
       int indexPlus2=0;
       int indexPlus3=0;
       int indexPlus5=0;
      for(int i=1;i<index;i++){
          int min=getMin(uArr[indexPlus2]*2,uArr[indexPlus3]*3,uArr[indexPlus5]*5);
          uArr[i]=min;
          while(uArr[i]==uArr[indexPlus2]*2)
              indexPlus2++;
          while(uArr[i]==uArr[indexPlus3]*3)
              indexPlus3++;
          while(uArr[i]==uArr[indexPlus5]*5)
              indexPlus5++;
      }
      return uArr[index-1];
    }
    public static int  getMin(int a,int b,int c){
        int temp=Math.min(a,b);
        return Math.min(temp,c);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值