50.实现指数相乘,指数暂不考虑浮点数
这个很容易想到折半相乘,不过就是不为2的倍数的时候要稍微处理一下。不是2的倍数的时候可以这样想,每个数多出来的那部分(不能做连乘
)刚好就是当前连乘的那一部分(多出来一个)
def myPow( x, n):
i = n
if i<0: i = -i
result = 1
while i != 0:
if i % 2 != 0: res *= x
x *= x
i = i // 2
return result if n > 0 else 1 / result
其实没想到,应该是把问题分为整除2和不能整除2的情况“分治”解决递归。
defdef myPow(x, n):
if n < 0:
x = 1 / x
n = -n
if n == 0:
return 1
# 两种情况
if n%2 == 1:
result = x * myPow(x, n-1)
return result
return myPow(x*x, n / 2)
53. 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
这个题目就好像那些找到连续的几个不重复序列之类的。这里的话就要注意是子序列的和小于等于0则不考虑,而不是说项小于0就不考虑。
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
result = nums[0]
s = 0
for i in range(len(nums)):
if s > 0 :
s += nums[i]
else:
s = nums[i]
result = max(result, s)
return result
看到评论有大神用类似于贪心算法的思想,记录一下。太巧秒了!用每一个元素来保存之前的最大序列的和。
def mySum(l):
for i in range(1, len(nums)):
nums[i] = nums[i] + max(nums[i-1], 0)
return max(nums)
169. 给定一个大小为n的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于⌊ n/2 ⌋
的元素。
这个直接遍历和用dict也可以,不过就是性能太差了。
直接用collections.Counter,那就更简单了。
其实list还有个sort的方法,从小到大排序或者是从大到小。那么针对这个问题,排序后中间的肯定是众数。
def majorityElement1(nums):
nums.sort()
print(nums)
return nums[(len(nums)//2)]