继续烧脑,,,
题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
时间还可以,空间似乎不行,想想也正常,我遍历了列表,题目中是有序列表,根本无需遍历,那么能不能用二分查找呢,感觉费劲,因为虽然为有序列表,但并不代表列表中没有重复的数据。
脑壳痛,不想努力了,今天就这样。。。