970.Powerful Integers

970.Powerful Integers

难度:Easy

Given two positive integers x and y, an integer is powerful if it is equal to x^i + y^j for some integers i >= 0 and j >= 0.

Return a list of all powerful integers that have value less than or equal to bound.

You may return the answer in any order. In your answer, each value should occur at most once.

Example 1:

Input: x = 2, y = 3, bound = 10
Output: [2,3,4,5,7,9,10]
Explanation: 
2 = 2^0 + 3^0
3 = 2^1 + 3^0
4 = 2^0 + 3^1
5 = 2^1 + 3^1
7 = 2^2 + 3^1
9 = 2^3 + 3^0
10 = 2^0 + 3^2
Example 2:

Input: x = 3, y = 5, bound = 15
Output: [2,4,6,8,10,14]
 

Note:

1 <= x <= 100
1 <= y <= 100
0 <= bound <= 10^6

直观暴力解法,需要考虑特殊情况,如x、y为1的情况。

class Solution {
vector<int> in={2};
bool isValid(int x,int y,int num)
{
    if(x==1 && y==1) return num==2;
    if(num==x+1 || num == y+1) return true;
    int lenx=log(double(num))/log(double(x));
  //  cout <<lenx<<endl;
    for(int i=0;i<=lenx;i++)
    {
        int tmp=num-pow(x,i);
        if(tmp==0) return false;
       if( pow(y,int(log(double(tmp))/log(double(y)))) ==tmp)  return true;
    }
    return false;
}
public:
    vector<int> powerfulIntegers(int x, int y, int bound) {
        vector<int>res;
        if(bound<2) return res;
        if(x==1&& y==1) 
        {
           res.push_back(2);
            return res;
        }
        if(x<y) swap(x,y);
        if(y==1) 
        {
            bound-=1;
            int lenx= log(double(bound))/log(double(x)) ;
            for(int i=0;i<=lenx;i++)
                res.push_back(pow(x,i)+1);
            return res;
        }
        res.push_back(2);
        for(int start=y+1;start<=bound;start++)
            if(isValid(x,y,start))
                res.push_back(start);
       // cout<<isValid(x,y,bound)<<endl;
        return res;
    }
};

执行用时 :1084 ms, 在所有 C++ 提交中击败了5.60%的用户 内存消耗 :8.6 MB, 在所有 C++ 提交中击败了80.70%的用户

两重遍历,长度是对数。另外需要使用集合去重。

class Solution {
public:
    vector<int> powerfulIntegers(int x, int y, int bound) {
        if(bound<2) return vector<int>();
        int xm= x==1 ? 1: log(double(bound))/log(double(x));
        int ym = y==1? 1: log(double(bound))/log(double(y));
       // cout<<xm<<" "<<ym<<endl;
        unordered_set<int>all;
        for(int i=0;i<=xm;i++)
        {
        for(int j=0;j<=ym;j++)
        {
            int tmp=pow(x,i)+pow(y,j);
      //     cout<<tmp<<endl;         
            if(tmp>bound) 
                break;     
            else
                if(!all.count(tmp))all.insert(tmp);
        }            
        }
        return vector<int>(all.begin(),all.end());
    }
};

执行用时 :4 ms, 在所有 C++ 提交中击败了91.60%的用户 内存消耗 :8.8 MB, 在所有 C++ 提交中击败了78.07%的用户

Last updated