167双指针
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
index1 = 0
index2 = len(numbers) - 1
while index1 <= index2:
if numbers[index1] + numbers[index2] == target:
return [index1+1,index2+1]
elif numbers[index1] + numbers[index2] >= target:
index2-=1
else:
index1+=1
#总结:写了很久,太久不做算法题,没感觉
215排序
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
for j in range(1,k+1,1):
if (len(nums))==j:
if len(nums)==1:
break
if nums[-1]>nums[-2]:
temp = nums[-1]
nums[-2]=nums[-1]
nums[-1]=temp
break
for i in range(len(nums)-1,j-1,-1):
if nums[i]>=nums[i-1]:
temp = nums[i-1]
nums[i-1]=nums[i]
nums[i]=temp
return nums[k-1]
#总结:考虑特殊情况,做了很久。 主要是对range 很不熟悉
真的记不住,,range的用法:
从小到大时:包含最小,不包含最大
从大到小时,包含最大,不包含最小
反正就是从哪里开始数,就包含最开始的那个。
如果起点和终点相同,则不输出
347桶排序
最开始不熟:python-dict的遍历、初始化空字典的方式、判断key早在字典中是否含有。
后来读错题目,以为是出现k次。题目是 k most frequent elements.应该是element按出现的次数排序。选前k个。
在网上学习了桶排序,好理解。将元素出现次数作为桶的下标。桶里面放元素。
注意extend和append不一样。extend会脱掉数组的框。直接放入元素。
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
a,res = {},[]
for i in nums:
a[i] = a[i] + 1 if i in a.keys() else 1
bucket = [[] for i in range(len(nums)+1)]
for i in a:
bucket[a[i]].append(i)
for i in range(len(bucket)-1,-1,-1):
if bucket[i]:
res.extend(bucket[i])
if len(res)==k:
break
return res
75荷兰国旗问题
不能使用库函数进行排序
followup里面说(除了输出各元素个数)规定换一种方式,\*one-pass 算法\*而且使用固定空间(不额外申请数组空间)
使用快排还是不会,每个1都要来一遍吗?
抄袭思路,头尾指针,
错误:
class Solution:
def sortColors(self, nums: List[int]) -> None:
p0,p2 = 0,len(nums)-1
i = 0
while i<=p2:
if nums[i]==2:
nums[i],nums[p2] = nums[p2],nums[i]
p2-=1
elif nums[i]==0:
nums[i],nums[p0] = nums[p0],nums[i]
p0+=1
i+=1
正确:
class Solution:
def sortColors(self, nums: List[int]) -> None:
p0,p2 = 0,len(nums)-1
i = 0
while i<=p2:
if nums[i]==2:
nums[i],nums[p2] = nums[p2],nums[i]
p2-=1
elif nums[i]==0:
nums[i],nums[p0] = nums[p0],nums[i]
p0+=1
i+=1
else:
i+=1
在i和p2元素交换位置后,2到后面了,但是我们无法保证现在i处的元素是否为0,如果是0,我们得调到前面去,作调整,所以i不能加1.
i与p0交换位置时,p0指的元素不可能是2,而换过来的元素也不可能为0,所以可以放心确定i+1
455贪心
python-sort函数,
- 直接sort(a),从小到大
- students = [(‘john’, ‘A’, 15), (‘jane’, ‘B’, 12), (‘dave’, ‘B’, 10)]
sorted(students, key=lambda s: s[2], reverse=True)
g1 = sort(g)结果错误,因为sort只能在原函数的基础上进行排序,不产生新数组
class Solution:
def findContentChildren(self, g: List[int], s: List[int]) -> int:
g.sort()
s.sort()
start,num = 0,0
for i in range(0,len(g)):
for j in range(start,len(s)):
if g[i]<=s[j]:
num+=1
start = j+1
break
return num