leetcode(1)-167、215、347、75、455

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值