• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

黄文超

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

【LeetCode每日一题】丑数2

丑数2

1、题目描述

给你一个整数 n ,请你找出并返回第 n 个 丑数 。

丑数 就是只包含质因数 2、3 和/或 5 的正整数。

示例1:

输入:n = 10
输出:12
解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。

示例2:

输入:n = 1
输出:1
解释:1 通常被视为丑数。

2、算法描述

思想描述:
	采用动态规划的思想,每个数分别与2,3,5相乘,然后把小的数值存入一个数组中,数组中的第n个值就是第n个丑	 数
具体实现:
	1、使用一个dp数组,存储n个丑数
	2、使用3个指针,分别指向,dp数组的第一个内容,他们分别和2,3,5相乘,谁小就在dp数组中存储谁。
步骤描述:
	1、定义一个数组为dp
	2、a2,a3,a5首先都指向数组的第0个位置(如下图)
	3、此时数组中记录了一个丑数,就是1
	4、然后比较dp[a2] * 2,dp[a3] * 3,dp[a5] * 5的大小
	5、比较除了2小,然后存入其中,然后a2就把指针往后移动一下
	6、依次类推,谁存入了dp数组中,那么那个指针就往后移动一下。

3、代码实现

package com.java;

import java.util.HashSet;
import java.util.PriorityQueue;
import java.util.Set;

public class Day11_Solution {
    public int nthUglyNumber1(int n) {
        int[] dp = new int[n+1];
        int a2=0,a3=0,a5=0;
        dp[0]=1;
        for (int i=1;i<n;i++) {
            int sum2 = dp[a2] * 2;
            int sum3 = dp[a3] * 3;
            int sum5 = dp[a5] * 5;
            dp[i] = Math.min(Math.min(sum2,sum3),sum5);
            if(dp[i] == sum2) {
                a2++;
            }
            if(dp[i] == sum3) {
                a3++;
            }
            if(dp[i] == sum5) {
                a5++;
            }
        }
        if (n == 1) {
            return 1;
        } else {
            return dp[n - 1];
        }
    }
}

posted on 2021-04-11 15:47  黄文超  阅读(141)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3