这是悦乐书的第367次更新,第395篇原创
java
今天介绍的是LeetCode
算法题中Easy
级别的第229
题(顺位题号是970
)。给定两个正整数x
和y
,若是对于某些整数i >= 0
且j >= 0
等于x^i + y^j
,则整数是强大的。算法
返回值小于或等于bound
的全部强大整数的列表。数据结构
你能够按任何顺序返回答案。在你的答案中,每一个值最多应出现一次。例如:翻译
输入:x = 2,y = 3,bound = 10
输出:[2,3,4,5,7,9,10]
说明:
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^2code
输入:x = 3,y = 5,bound = 15
输出:[2,4,6,8,10,14]class
注意:数据结构与算法
1 <= x <= 100List
1 <= y <= 100循环
0 <= bound <= 10^6
技巧
直接翻译题目便可,没有什么特殊的技巧,可是须要注意一点,由于判断条件时x或者y的几回方小于bound
,若是x
或者y
为1的时候,1的任何次方都会是1,会一直小于bound
,会形成死循环。
public List<Integer> powerfulIntegers(int x, int y, int bound) { Set<Integer> set = new HashSet<Integer>(); for (int i=0; Math.pow(x, i) < bound; i++) { for (int j=0; Math.pow(y, j) < bound; j++) { int sum = (int)Math.pow(x, i)+(int)Math.pow(y, j); if (sum <= bound) { set.add((int)sum); } // y等于1时,容易形成死循环,要结束掉 if (y == 1) { break; } } // x等于1时,容易形成死循环,要结束掉 if (x == 1) { break; } } return new ArrayList<>(set); }
针对上面第一种解法,咱们也能够不借助Math
类的pow
方法,用累计相乘替代,思路都是同样的。
public List<Integer> powerfulIntegers2(int x, int y, int bound) { Set<Integer> set = new HashSet<Integer>(); for (int i=1; i<bound; i *= x) { for (int j=1; j<bound; j *= y) { if (i+j <= bound) { set.add(i+j); } if (y == 1) { break; } } if (x == 1) { break; } } return new ArrayList<>(set); }
算法专题目前已连续日更超过七个月,算法题文章235+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是所有内容,若是你们有什么好的解法思路、建议或者其余问题,能够下方留言交流,点赞、留言、转发就是对我最大的回报和支持!