面试之leetcode分治-求众数,x幂等

Posted L的存在

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试之leetcode分治-求众数,x幂等相关的知识,希望对你有一定的参考价值。

1 leetcode50 计算 x 的 n 次幂函数。

实现 pow(xn) ,即计算 x 的 n 次幂函数。

(1)调用库函数

(2)暴力o(N)

(3)分治

xxxxxx.......x   采用两端夹,如果是偶数 y=x的二分之n次方  result=y*y。如果是奇数,x的二分之n次方,result=y*y*x

x(n)->x(n/2)->x(n/4).....x(0)  每次减半,logn

技术图片
 1 class Solution(object):
 2     def myPow(self, x, n):
 3         """
 4         :type x: float
 5         :type n: int
 6         :rtype: float
 7         """
 8         if not n:
 9             return 1
10         if n<0:
11             return 1 / self.myPow(x,-n)
12         if n%2:
13             return x*self.myPow(x,n-1)
14         return self.myPow(x*x,n/2)
View Code

非递归

技术图片
 1 class Solution(object):
 2     def myPow(self, x, n):
 3         """
 4         :type x: float
 5         :type n: int
 6         :rtype: float
 7         
 8         if not n:
 9             return 1
10         if n<0:
11             return 1 / self.myPow(x,-n)
12         if n%2:
13             return x*self.myPow(x,n-1)
14         return self.myPow(x*x,n/2)
15         """
16         if n<0:
17             x=1/x
18             n=-n
19         pow=1
20         while n:
21             if n&1:
22                 pow*=x
23             x*=x
24             n>>=1
25         return pow
View Code

 

2 leetcode169 求众数

(1)暴力 两个循环,针对每一个x进行计数,时间复杂度n平方

(2)map,key为元素,value为count

c++版本 时间复杂度0(n) 循环一次 每一次对mapO(1)

技术图片
 1 class Solution {
 2 public:
 3     int majorityElement(vector<int>& nums) {
 4         unordered_map<int,int>hash;
 5         int res=0;
 6         int len=nums.size();
 7         for(int i=0;i<len;i++)
 8         {
 9             hash[nums[i]]++;
10             if(hash[nums[i]]>len/2)
11             {
12                 res=nums[i];
13             }
14         }
15         return res;
16     }
17 };
View Code

(3) sort nlogn

(4)分治

先分两部分,left和right,如果right==left,那么总体也是ok,结果就是right/left。如果不相等,比较谁count大

技术图片
 1 def majorityElement(self, nums):
 2     if not nums:
 3         return None
 4     if len(nums) == 1:
 5         return nums[0]
 6     a = self.majorityElement(nums[:len(nums)//2])
 7     b = self.majorityElement(nums[len(nums)//2:])
 8     if a == b:
 9         return a
10     return [b, a][nums.count(a) > len(nums)//2]
View Code

 

以上是关于面试之leetcode分治-求众数,x幂等的主要内容,如果未能解决你的问题,请参考以下文章

《LeetCode之每日一题》:185.求众数 II

leetcode-169求众数

求众数问题算法的思路(用递归与分治策略)

LeetCode求众数

求众数

LeetCode(169. 求众数)