递归&分治
递归-循环:通过函数体进行循环
分治:没有所谓的中间结果,也就是不会重复计算,当出现重复计算和递归差不多。
50.Pow(x,n)
实现pow(x,n),即计算x的n次幂的函数。
示例1:
输入: 2.00000, 10
输出: 1024.00000
示例2:
输入: 2.10000, 3
输出: 9.26100
示例3:
输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
说明:
- -100.0 < x < 100.0
- n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。
【思路】
从中间一分为二,根据奇数偶数分情况讨论。计算的次数看N可以减半多少次最后退化为0。O(logN)
【实现代码】
package leetcode_50;
import java.util.Scanner;
public class Leetcode_50 {
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
double x=scanner.nextDouble();
int N=scanner.nextInt();
double result;
result=myPow_2(x,N);
//result=myPow(x,N);
System.out.print(result);
}
private static double myPow_2(double x, int n) {
long N=n;
if(N<0){
x=1/x;
N=-N;
}
return fastPow(x,N);
}
private static double fastPow(double x, long n) {
if(n==0){
return 1.0;
}
double half=fastPow(x, n/2);
if(n%2==0){
return half*half;
}else{
return half*half*x;
}
}
private static double myPow(double x, int n) {
if(n==0) return 1.0;
if(n<0) return 1/myPow(x, -n);
double half=myPow(x, n/2);
if(n%2==0){
return half*half;
}else{
return half*half*x;
}
//return 0;
}
}
【注意点】
之前做题从来没注意到题上数字大小的限制,这次提醒n的范围为-2^31——2 31-1,int的范围为-231——2 ^31-1。
byte的取值范围为-128~127,占用1个字节(-2的7次方到2的7次方-1)
short的取值范围为-32768~32767,占用2个字节(-2的15次方到2的15次方-1)
int的取值范围为(-2147483648~2147483647),占用4个字节(-2的31次方到2的31次方-1)
long的取值范围为(-9223372036854774808~9223372036854774807),占用8个字节(-2的63次方到2的63次方-1)。
想不通的是为啥第一种方法会提醒栈溢出,感觉和第二种方法没差别呀。
169.求众数
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例1:
输入: [3,2,3]
输出: 3
示例2:
输入: [2,2,1,1,1,2,2]
输出: 2
【】