函数

enumerate()

1
2
3
4
5
6
>>> seq = ['one', 'two', 'three']
>>> for i, element in enumerate(seq):
print i, element
0 one
1 two
2 three

容器

dict() :字典,哈希表实现,相当于unored_map

只出现一次的数字

题意

V1:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。要求O(N),且不使用额外空间。

V2:除一个元素仅出现 一次 外,其余每个元素都恰出现 三次 。要求O(N),且不使用额外空间。

V3:除两个元素仅出现 一次 外,其余每个元素都恰出现 两次 。要求O(N),且不使用额外空间。

思路

V1:全部异或起来就行了

V2:计算每位出现的次数,%3。拼接起来就是答案

V3:设答案为a,b。先全部异或起来,结果最低1的位数,表示a和b不同的一位,以此再遍历一遍数组得到答案。

代码

V3:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution:
def singleNumber(self, nums: List[int]) -> List[int]:
xorsum = 0
for num in nums:
xorsum ^= num

lsb = xorsum & (-xorsum)
type1 = type2 = 0
for num in nums:
if num & lsb:
type1 ^= num
else:
type2 ^= num

return [type1, type2]

最多水的容器

题意

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

思路

双指针,在初始时,左右指针分别指向数组的左右两端,每次移动对应高度较小的那个指针。

证明:如果移动较大的指针,后面的答案只会更小。

代码

1
2
3
4
5
6
7
8
class Solution:
def maxArea(self, height: List[int]) -> int:
a=0;b=len(height)-1;ans=0
while a<b:
ans = max(ans,(b-a)*min(height[a],height[b]))
if height[a]<height[b]:a+=1
else:b-=1
return ans

题意

思路

代码

1

题意

思路

代码

1

题意

思路

代码

1

题意

思路

代码

1