Leetcode——50.Pow(x,n)、169求衆數

遞歸&分治
遞歸-循環:通過函數體進行循環
分治:沒有所謂的中間結果,也就是不會重複計算,當出現重複計算和遞歸差不多。
在這裏插入圖片描述

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

【】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章