每日一题 - 剑指 Offer 49. 丑数】的更多相关文章

题目信息 时间: 2019-07-03 题目链接:Leetcode tag:动态规划 小根堆 难易程度:中等 题目描述: 我们把只包含质因子 2.3 和 5 的数称作丑数(Ugly Number).求按从小到大的顺序的第 n 个丑数. 示例: 输入: n = 10 输出: 12 解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数. 注意 1. 1是丑数 2. n < 1690 解题思路 本题难点 丑数的定义以及查找的方式 具体思路 丑数只包含因子 2,3,5…
剑指 Offer 49. 丑数 Offer_49 题目详情 解法一:小根堆+哈希表/HashSet 根据丑数的定义,如果a是丑数,那么a2, a3以及a*5都是丑数 可以使用小根堆存储按照从小到大排序的丑数. package com.walegarrett.offer; import java.util.HashMap; import java.util.PriorityQueue; /** * @Author WaleGarrett * @Date 2021/2/8 21:39 */ /**…
题目 剑指 Offer 49. 丑数 思路1 丑数是只包含 2.3.5 这三个质因子的数字,同时 1 也是丑数.要计算出 n 之前全部的丑数,就必须将 n 之前的每个丑数都乘以 2.3.5,选取出最小的那个数 但是如果每计算一个丑数都要将之前重新遍历一遍,时间复杂度较高 因此我们使用动态规划,创建一个dp数组,dp[i] 代表第 i + 1 个丑数,同时状态转移方程为: \[\begin{cases} dp[a]×2>dp[i−1]≥dp[a−1]×2 \\ dp[b]×3>dp[i−1]≥d…
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 我们把只包含因子2.3和5的数称作丑数(Ugly Number).求按从小到大的顺序的第1500个丑数.例如6.8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做第一个丑数. 思路 直观思路:逐一判断每个整数是否为丑数,效率太低. 空间换时间的解法: 创建数组存放已经排序好的丑数,这将消耗一定的内存开销.根据丑数的定义,丑数应该是另一个丑数的2.3或者5倍的结果,…
通俗易懂的解释: 首先从丑数的定义我们知道,一个丑数的因子只有2,3,5,那么丑数p = 2 ^ x * 3 ^ y * 5 ^ z,换句话说一个丑数一定由另一个丑数乘以2或者乘以3或者乘以5得到,那么我们从1开始乘以2,3,5,就得到2,3,5三个丑数,在从这三个丑数出发乘以2,3,5就得到4,6,10,6,9,15,10,15,25九个丑数,我们发现这种方法会得到重复的丑数,而且我们题目要求第N个丑数,这样的方法得到的丑数也是无序的.那么我们可以维护三个队列: (1)丑数数组: 1 乘以2的…
题目描述 我们把只包含质因子 2.3 和 5 的数称作丑数(Ugly Number).求按从小到大的顺序的第 n 个丑数. 示例: 输入: n = 10 输出: 12 解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数. 说明: 1 是丑数. n 不超过1690. 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/chou-shu-lcof 代码实现 class Solution { public: in…
[剑指Offer]丑数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 解题方法 第一感觉肯定是把每个数字逐个遍历判断是否是丑数的方式,这样的话效率不高. 比较巧妙的方式是使用空间换时间.我们…
把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. leetcode上也有这道题.不过是判断一个数是否为丑数.貌似是我第二道解出来的leetcode,印象还蛮深的.用了递归. class Solution { public: bool isUgly(int num) { ) return false; ) return true; ==) isUgly(num/); =…
该题目来源于牛客网<剑指offer>专题. 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7.习惯上我们把1当做是第一个丑数. 求按从小到大的顺序的第N个丑数. Go语言实现: func getUglyNumber(index int) int { //第0-6个丑数,分别是0-6 if index < 7 { return index } ​ i2 := 0 i3 := 0 i5 := 0 //从1开始,1*2,1*3,…
本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:…
题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 输入: 输入包括一个整数N(1<=N<=1500). 输出: 可能有多组测试数据,对于每组数据,输出第N个丑数. 样例输入: 样例输出: 解题思路: 最简单的思路是,从1到大数,每个数都检测一遍是否是丑数,检测方法可以考虑 int ugly(int number){ == ){ ); } == ){ );…
题目描述 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 题目地址 https://www.nowcoder.com/practice/6aa9e04fc3794f68acf8778237ba065b?tpId=13&tqId=11186&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interv…
原创博文,转载请注明出处!本题牛客网地址 博客文章索引地址 博客文章中代码的github地址 1. 题目 2. 思路 空间换时间的方法.由于题目要求按序查找丑数,可以采用辅助容器vector按序存储丑数,返回指定位置丑数的策略.用辅助容器vector按序存储丑数的关键在于怎么按序计算丑数.按序计算丑数的方法:设辅助变量t2为一个丑数在vector中的索引,t2位置之前的丑数*2之后小于等于最大丑数,t2位置及t2位置之后的丑数*2后大于最大丑数.设辅助变量t3为一个丑数在vector中的索引,t…
本文算法使用python3实现 1. 问题1 1.1 题目描述:   把只包含因子2.3和5的数称作丑数(Ugly Number).判断一个数是否是丑数.   时间限制:1s:空间限制:32768K 1.2 思路描述:   大致思路:将该数依次除以 $ 2,3,5 $ ,若最后商为 $ 1 $ 则是丑数,否则,不是丑数. 1.3 程序代码: class Solution: def isUgly(self, num): '''判断num是否是丑数''' if num <= 0: return Fa…
丑数:只有2 3 5 这三个因子的数,求前(第)1500个.习惯上我们把1当作第一个丑数 例如 6, 8是丑数.14不是. #include <stdio.h> int Min(int x,int y, int z){ int min = (x <= y) ? x : y; return min = (z <= min) ? z : min; } int GetUglyNumber(int index){ if(index <= 0){ return 0; } int* ug…
题目描述: 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 解题思路: 1. 常规思路,从1开始到index判断每个数是否是丑数,但这样时间上肯定过不了,因为存在重复计算. 2. 用空间换时间的思路,发现每一个丑数都是由之前的丑数乘2,3或5得到的,所以考虑从第一个丑数开始向后推到第index个.由于需要维持一个有序的丑数序列,对于每个丑数都分别乘2,3,5这三…
题目描述 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数.   //使用遍历判断的方法 class Solution01 { public: int GetUglyNumber_Solution(int index) { ); ; ; cnt < index; ++i) { if (isChouShu(i)) cnt++; if (cnt == index) re…
题目信息 时间: 2019-07-01 题目链接:Leetcode tag: 快速排序 难易程度:中等 题目描述: 输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个. 示例1: 输入: [10,2] 输出: "102" 示例2: 输入: [3,30,34,5,9] 输出: "3033459" 提示 1. 0 < nums.length <= 100 解题思路 本题难点 此题求拼接起来的 "最小数字&q…
题目信息 时间: 2019-06-30 题目链接:Leetcode tag: 快排 难易程度:中等 题目描述: 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例1: 输入:arr = [3,2,1], k = 2 输出:[1,2] 或者 [2,1] 示例2: 输入:arr = [0,1,2,1], k = 1 输出:[0] 提示 1.0 <= k <= arr.length <= 10000 2…
题目信息 时间: 2019-07-04 题目链接:Leetcode tag:二分查找 哈希表 难易程度:简单 题目描述: 统计一个数字在排序数组中出现的次数. 示例1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 示例2: 输入: nums = [5,7,7,8,8,10], target = 6 输出: 0 注意 1. 0 <= 数组长度 <= 50000 解题思路 本题难点 排序数组中查找数字,性能最优. 具体思路 排序数组中的搜索问题,首先想到…
题目信息 时间: 2019-07-03 题目链接:Leetcode tag: 单链表 难易程度:简单 题目描述: 输入两个链表,找出它们的第一个公共节点. 示例: A: a1 -> a2 \ -> c1 -> c2 -> c3 / B:b1 -> b2 -> b3 注意 1. 如果两个链表没有交点,返回 null. 2. 在返回结果后,两个链表仍须保持原有的结构. 3. 可假定整个链表结构中没有循环. 4. 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存.…
题目信息 时间: 2019-07-03 题目链接:Leetcode tag:哈希表 难易程度:简单 题目描述: 在字符串 s 中找出第一个只出现一次的字符.如果没有,返回一个单空格. s 只包含小写字母. 示例: s = "abaccdeff" 返回 "b" s = "" 返回 " " 注意 1. 0 <= s 的长度 <= 50000 解题思路 本题难点 字符串查找第一个只出现一次的字符,性能最优. 具体思路 哈…
题目信息 时间: 2019-07-02 题目链接:Leetcode tag: 动态规划 哈希表 难易程度:中等 题目描述: 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度. 示例1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3. 示例2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1…
题目信息 时间: 2019-07-02 题目链接:Leetcode tag:动态规划 难易程度:中等 题目描述: 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0).你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格.直到到达棋盘的右下角.给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物? 示例: 输入: [ [1,3,1], [1,5,1], [4,2,1] ] 输出: 12 解释: 路径 1→3→5→2→1 可以拿到最多价值…
题目信息 时间: 2019-07-02 题目链接:Leetcode tag: 动态规划 难易程度:中等 题目描述: 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 "l",--,25 翻译成 "z".一个数字可能有多个翻译.请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法. 示例: 输入: 12258 输出: 5 解释: 12258有5种不同的翻译,分别是…
题目信息 时间: 2019-07-01 题目链接:Leetcode tag: 规律 难易程度:中等 题目描述: 数字以0123456789101112131415-的格式序列化到一个字符序列中.在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等. 请写一个函数,求任意第n位对应的数字. 示例1: 输入:n = 3 输出:3 示例2: 输入:n = 11 输出:0 提示 1. 0 <= n < 2^31 解题思路 本题难点 0<n<9时,第n位对应的数字为…
题目信息 时间: 2019-07-01 题目链接:Leetcode tag: 整除 取余 规律 递归 难易程度:中等 题目描述: 输入一个整数 n ,求1-n这n个整数的十进制表示中1出现的次数. 例如,输入12,1-12这些整数中包含1 的数字有1.10.11和12,1一共出现了5次. 示例1: 输入:n = 12 输出:5 示例2: 输入:n = 13 输出:6 提示 1. 1 <= n < 2^31 解题思路 本题难点 数字 n 是个 x 位数,记 n 的第 i 位为 n i ,则可将…
题目信息 时间: 2019-06-30 题目链接:Leetcode tag: 动态规划 难易程度:简单 题目描述: 输入一个整型数组,数组里有正数也有负数.数组中的一个或连续多个整数组成一个子数组.求所有子数组的和的最大值. 要求时间复杂度为O(n). 示例: 输入: nums = [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6. 提示 1. 1 <= arr.length <= 10^5 2. -100 <= ar…
题目信息 时间: 2019-06-30 题目链接:Leetcode tag: 大根堆 小根堆 难易程度:中等 题目描述: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 设计一个支持以下两种操作的数据结构: void addNum(int num) - 从数据流中添加一个整数到数据结构中. double findMedian() - 返回目前所有元素的中位数…
题目信息 时间: 2019-06-29 题目链接:Leetcode tag: 数组 哈希表 难易程度:简单 题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 假设数组是非空的,并且给定的数组总是存在多数元素. 示例: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 提示 1 <= 数组长度 <= 50000 解题思路 本题难点 如何实现查找数组中的众数的最优解,时间复杂度和空间复杂度最小. 具体思路 摩尔投票法: 票数和:由于众数出现的次数…