【40讲系列6】递归、分治
一、理论
二、典型例题
☆☆①:快速幂->实现计算x的n次幂函数(LC50、剑指12.数值的整数次方)【字节面试】
思路:采用分治的思想,时间复杂度为O(logn)
class Solution { public double myPow(double x, long n) { // 方法1:递归 /* if (n == 0) return 1.0; if (n < 0) return 1 / myPow(x,-n); if ((n & 1) == 1){ return x * myPow(x,n-1); // n为奇数 } return myPow(x * x,n/2); // n为偶数 */ // 方法2:非递归 // 思想是:每次把x扩大一倍,同时把幂次n/2,直至将幂降到1 if (x == 0) return 0.0; double res = 1.0; if (n < 0){ x = 1 / x; n = -n; } while (n > 0){ if ((n & 1) == 1){ // 奇数时,会多出一个x res *= x; } x *= x; n >>= 1; } return res; } }
②:找出数组中出现次数大于 n/2 的元素(LC169、剑指28.数组中出现次数超过一半的数字)