首页 > 其他 > 详细

leetcode刷题 373~

时间:2020-11-02 14:35:38      阅读:45      评论:0      收藏:0      [点我收藏+]

题目373题

查找和最小的k对数字

给定两个以升序排列的整形数组 nums1 和 nums2, 以及一个整数 k。

定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2。

找到和最小的 k 对数字 (u1,v1), (u2,v2) ... (uk,vk)。

示例 1:

输入: nums1 = [1,7,11], nums2 = [2,4,6], k = 3
输出: [1,2],[1,4],[1,6]
解释: 返回序列中的前 3 对数:
[1,2],[1,4],[1,6],[7,2],[7,4],[11,2],[7,6],[11,4],[11,6]

思路

1.暴力法,取出所有数字排序

2.优先队列:

将数组1作为base,滑动数组2。每将一对作为结果输出时,将下一对加入队列中,若选择的这对位于数组2的开始,则将数组1滑动1位加入队列

实现

class Solution:
    def kSmallestPairs(self, nums1: List[int], nums2: List[int], k: int) -> List[List[int]]:
        """
        数组1作为base,滑动数组2
        """
        heap = []
        def push(i, j):
            if i < len(nums1) and j < len(nums2):
                heapq.heappush(heap, [nums1[i] + nums2[j], i, j])
        push(0,0)
        result = []
        while heap and len(result) < k:
            pair, i, j = heapq.heappop(heap)
            result.append([nums1[i], nums2[j]])
            push(i,j+1)
            if j == 0:
                push(i + 1, 0)
        return result

题目374题

猜数字大小

猜数字游戏的规则如下:

每轮游戏,我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。
如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。
你可以通过调用一个预先定义好的接口 int guess(int num) 来获取猜测结果,返回值一共有 3 种可能的情况(-1,1 或 0):

-1:我选出的数字比你猜的数字小 pick < num
1:我选出的数字比你猜的数字大 pick > num
0:我选出的数字和你猜的数字一样。恭喜!你猜对了!pick == num

思路

二分法

实现

class Solution:
    def guessNumber(self, n: int) -> int:
        left ,right = 1, n
        while left <= right:
            testcase = (left+right)//2
            result = guess(testcase)
            if  result == 0:
                return testcase
            elif result == 1:
                left = testcase+1
            else:
                right = testcase-1

题目376题

摆动序列

如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。

例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。

给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(也可以不删除)元素来获得子序列,剩下的元素保持其原始顺序。

思路

动态规划:维护一个增序列和一个减序列

实现

class Solution:
    def wiggleMaxLength(self, nums: List[int]) -> int:
        if len(nums) <2:
            return len(nums)
        up, down = 1, 1
        for i in range(1, len(nums)):
            if nums[i] > nums[i-1]:
                up = down + 1
            elif nums[i] < nums[i-1]:
                down = up+1
        return max(up,down)

题目367题

思路实现

题目367题

思路实现

leetcode刷题 373~

原文:https://www.cnblogs.com/mgdzy/p/13914220.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!