遞歸&分治
遞歸-循環:通過函數體進行循環
分治:沒有所謂的中間結果,也就是不會重複計算,當出現重複計算和遞歸差不多。
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
【】