分治

50 快速幂

实现 pow(x, n) ,即计算 x 的 n 次幂函数(即2021/10/15 分治 傅禹嘉 - 图1)。

  1. class Solution {
  2. public double myPow(double x, int n) {
  3. if(x==0||x==1)return x;
  4. if(n<0)return 1/Pow(x,-n);
  5. return Pow(x,n);
  6. }
  7. private double Pow(double x, int n)
  8. {
  9. if(n==0)return 1;
  10. double y = Pow(x,n/2);
  11. if(n%2==0)return y*y;
  12. else return y*y*x;
  13. }
  14. }

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

  1. class Solution {
  2. public int findKthLargest(int[] nums, int k) {
  3. divide(nums, 0, nums.length - 1, k);
  4. return nums[nums.length - k];
  5. }
  6. private void divide(int[] nums, int left, int right, int k) {
  7. if (left >= right) {
  8. return;
  9. }
  10. int position = conquer(nums, left, right);//代表是第几大的
  11. if (position == nums.length - k) {
  12. return;
  13. } else if (position < nums.length - k) {
  14. divide(nums, left, position + 1, k);
  15. } else {
  16. divide(nums, left, position - 1, k);
  17. }//确定位置与待比的位置
  18. }
  19. private int conquer(int[] nums, int left, int right) {//每一个都与墙比大小,比墙小放在左边,比墙大放在右边。
  20. int pivot = nums[right];
  21. int wall = left;
  22. for (int i = left; i < right; i++) {
  23. if (nums[i] < pivot) {
  24. swap(nums, i, wall);
  25. wall++;
  26. }
  27. }
  28. swap(nums, wall, right);
  29. return wall;
  30. }
  31. private void swap(int[] nums, int i, int j) {
  32. int tmp = nums[i];
  33. nums[i] = nums[j];
  34. nums[j] = tmp;
  35. }
  36. }