LeetCode题解(2020-10-29)

继续烧脑,,,

题1:最长连续递增序列

题目描述

给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。

连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], …, nums[r - 1], nums[r]] 就是连续递增子序列。

示例 1:

输入:nums = [1,3,5,4,7]
输出:3
解释:最长连续递增序列是 [1,3,5], 长度为3。
尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-continuous-increasing-subsequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

这题也挺有意思的,感觉有点像前一天的单滑动窗口,但想来想去,用滑动窗口也没啥好的解决思路,用动态规划来解决更快一点

提交代码

class Solution:
    def findLengthOfLCIS(self, nums: List[int]) -> int:
        if nums == []:
            return 0
        pin = [1] * len(nums)
        for i in range(1,len(nums)):
            if nums[i] > nums[i - 1]:
                pin[i] = pin[i - 1] + 1
        return max(pin)

pin是为了动态规划新建立的一个全1列表,如果nums中后一个数大于前一个数,就让pin对应的数在前一个数的基础上增1,新的pin中的最大值就是最长连续递增数列。

提交情况

在这里插入图片描述
很不错的结果

题2:二分查找

题目描述

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-search
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路&代码

这题说的是要二分查找,但如果用Python的话,能做到一行代码解决
下面是我第一次提交的代码

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        return nums.index(target) if target in nums else -1

在这里插入图片描述
还打败了2/3的人
但既然题目要求二分查找,那还是按题目要求来
下面是引用官方的二分查找原理:

二分查找是一种基于比较目标值和数组中间元素的教科书式算法。
如果目标值等于中间元素,则找到目标值。
如果目标值较小,继续在左侧搜索。
如果目标值较大,则继续在右侧搜索。
在这里插入图片描述

作者:LeetCode
链接:https://leetcode-cn.com/problems/binary-search/solution/er-fen-cha-zhao-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
那就按这个二分思路写代码

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        n = len(nums)
        left = 0
        right = n - 1
        while left <= right:
            pivot = left + (right - left) // 2
            if nums[pivot] == target:
                return pivot
            elif target < nums[pivot]:
                right = pivot - 1
            else:
                left = pivot + 1
        return -1

在这里插入图片描述
从提交情况来看,二分查找果然效率还能提高,不过似乎空间复杂度提高了不少。

题3:魔术索引

题目描述

魔术索引。 在数组A[0…n-1]中,有所谓的魔术索引,满足条件A[i] = i。给定一个有序整数数组,编写一种方法找出魔术索引,若有的话,在数组A中找出一个魔术索引,如果没有,则返回-1。若有多个魔术索引,返回索引值最小的一个。

示例1:

输入:nums = [0, 2, 3, 4, 5]
输出:0
说明: 0下标的元素为0
示例2:

输入:nums = [1, 1, 1]
输出:1

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/magic-index-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题过程

这题基本不用费脑子,遍历索引就行了

class Solution:
    def findMagicIndex(self, nums: List[int]) -> int:
        ind = []
        for i in range(len(nums)):
            if i == nums[i]:
                ind.append(i)
        return min(ind) if len(ind) > 0 else -1

在这里插入图片描述
时间还可以,空间似乎不行,想想也正常,我遍历了列表,题目中是有序列表,根本无需遍历,那么能不能用二分查找呢,感觉费劲,因为虽然为有序列表,但并不代表列表中没有重复的数据。
脑壳痛,不想努力了,今天就这样。。。

猜你喜欢

转载自blog.csdn.net/u012848304/article/details/109352606
今日推荐