分治
50 快速幂
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即)。
class Solution {public double myPow(double x, int n) {if(x==0||x==1)return x;if(n<0)return 1/Pow(x,-n);return Pow(x,n);}private double Pow(double x, int n){if(n==0)return 1;double y = Pow(x,n/2);if(n%2==0)return y*y;else return y*y*x;}}
215 数组中的第K个最大元素
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
class Solution {public int findKthLargest(int[] nums, int k) {divide(nums, 0, nums.length - 1, k);return nums[nums.length - k];}private void divide(int[] nums, int left, int right, int k) {if (left >= right) {return;}int position = conquer(nums, left, right);//代表是第几大的if (position == nums.length - k) {return;} else if (position < nums.length - k) {divide(nums, left, position + 1, k);} else {divide(nums, left, position - 1, k);}//确定位置与待比的位置}private int conquer(int[] nums, int left, int right) {//每一个都与墙比大小,比墙小放在左边,比墙大放在右边。int pivot = nums[right];int wall = left;for (int i = left; i < right; i++) {if (nums[i] < pivot) {swap(nums, i, wall);wall++;}}swap(nums, wall, right);return wall;}private void swap(int[] nums, int i, int j) {int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}}
