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

【】

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