zoukankan      html  css  js  c++  java
  • 【数据结构】超级丑数 Super Ugly Number

    @

    超级丑数 Super Ugly Number

    A super ugly number is a positive integer whose prime factors are in the array primes.

    Given an integer n and an array of integers primes, return the nth super ugly number.

    The nth super ugly number is guaranteed to fit in a 32-bit signed integer.

    Input: n = 12, primes = [2,7,13,19]
    Output: 32
    

    思路

    查找第n个丑数,这个类型的问题,基本有2个思路:

    1 使用队列和哈希表进行处理。

    2 使用N指针处理。

    • 第一种容易理解,在问题规模并不大的情况下,可以采用。

    • 第二种方法,需要通过数学思考,通过处理避免去产生可能重复的数字。

    • 第三种方法,DP,暂时不考虑。

    当出现像一组的prime factor,方法一就会出现时间复杂度和空间复杂度会超出我们的容忍度。

    在计算第n个丑数的时候,必须知道前n-1个丑数是多少,然后分别和prime factor相乘得到一组数,从中选择最小的一个。如果使用暴力计算,是可以得到每一个数字,但是问题是会出现重复的结果。

    建立一个用于存放丑数结果的ArrayList命名list

    此处我们借助指针数组,建立一个长度为primes.length的数组pospos[i]表示primes[i]下一步要去乘list中的第pos[i]个丑数。

    通过循环计算出一轮选择Min(primes[i]*list.get(pos[i])),准备放入list,如果任何一个primes[i]*list.get(pos[i])和ans相等,说明有重复,对应的pos[i]后移一位,用来保证每次乘积都是当前这个prime能乘出的最小值,并且不会重复。

    public int nthSuperUglyNumber(int n, int[] primes){
    	int[] pos = new int[primes.length];
    	List<Integer> list = new ArrayList<>();
    	list.add(1);
    	int ans =1;
    	while(list.size<n){
    		ans = list.get(pos[0])*primes[0]; // ans must be seted in every loop
    		for(int i =1;i<primes.length;i++){
    			ans = Math.min(ans,list.get(pos[i])*primes[i]);
    		}	
    		
    		for(int i =0;i<primes.length;i++){
    			if(list.get(pos[i])*primes[i]==ans){
    				pos[i]++;
    			}
    		}
    		list.add(ans);
    	}
    	return ans ;
    }
    

    Tag

    math

  • 相关阅读:
    求原根
    koa2-router中间件来请求数据获取
    koa2 快速开始
    如何修改host
    bzoj 2480——扩展BSGS
    bzoj 4128: Matrix ——BSGS&&矩阵快速幂&&哈希
    Ubuntu 16.04LTS 安装和配置Bochs
    2019ICPC徐州网络赛 A.Who is better?——斐波那契博弈&&扩展中国剩余定理
    求十亿内所有质数的和
    MYSQL的随机查询的实现方法
  • 原文地址:https://www.cnblogs.com/dreamtaker/p/15366051.html
Copyright © 2011-2022 走看看