300. 最长递增子序列
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
示例 1:
123>输入:nums = [10,9,2,5,3,7,101,18]>输出:4>解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。
示例 2:
12>输入:nums = [0,1,0,3,2,3]>输出:4
示例 3:
12>输入:nums = [7,7,7,7,7,7,7]>输出:1
使用单调栈和二分查找结合解体
单调栈用来维护一个严格递增的序列,二分查找用于快速定位第一个破坏当前序列递增顶的序列,并且找到后替换以维持栈的单调性
这里主要用到的策略:
nums[i] > stack[-1]:栈顶元素比当前元素小,直接放在栈的顶部,是不是不破坏单调栈的单调递增特性
nums[i] <= stack[-1]:栈顶元素比当前元素大,这里为 ...
35. 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
示例 1:
12>输入: nums = [1,3,5,6], target = 5>输出: 2
示例 2:
12>输入: nums = [1,3,5,6], target = 2>输出: 1
示例 3:
12>输入: nums = [1,3,5,6], target = 7>输出: 4
最简单的二分法:
1234567891011class Solution(object): def searchInsert(self, nums, target): left , right = 0, len(nums) - 1 while (left <= right): mid = (left + right) / 2 if (nums[mid] < target): ...
34. 在排序数组中查找元素的第一个和最后一个位置
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
示例 1:
12>输入:nums = [5,7,7,8,8,10], target = 8>输出:[3,4]
示例 2:
12>输入:nums = [5,7,7,8,8,10], target = 6>输出:[-1,-1]
示例 3:
12>输入:nums = [], target = 0>输出:[-1,-1]
基本思路也很简单,主要就是通过两次查询分别找到首尾的位置
1234567891011121314151617181920212223242526272829303132333435class Solution(object): def searchRange(self, nums, target): if no ...
394. 字符串解码
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
示例 1:
12>输入:s = "3[a]2[bc]">输出:"aaabcbc"
示例 2:
12>输入:s = "3[a2[c]]">输出:"accaccacc"
示例 3:
12>输入:s = "2[abc]3[cd]ef">输出:"abcabccdcdcdef"
示例 4:
12>输入:s = "abc3[cd]xyz">输出:"abccdcdcdxyz& ...
4. 寻找两个正序数组的中位数
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
示例 1:
123>输入:nums1 = [1,3], nums2 = [2]>输出:2.00000>解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
123>输入:nums1 = [1,2], nums2 = [3,4]>输出:2.50000>解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
困难题
目前还做不明白,只会先合并之后再取出中位数:
123456789101112131415161718192021222324252627class Solution(object): def findMedianSortedArrays(self, nums1, nums2): """ :type nums1: List[in ...
739. 每日温度
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
示例 1:
12>输入: temperatures = [73,74,75,71,69,72,76,73]>输出: [1,1,4,2,1,1,0,0]
示例 2:
12>输入: temperatures = [30,40,50,60]>输出: [1,1,1,0]
示例 3:
12>输入: temperatures = [30,60,90]>输出: [1,1,0]
这里需要使用到单调栈
递减栈(Decreasing Stack)是一种数据结构,通常用于解决与单调递减关系有关的问题。递减栈的特点是栈中的元素按照递减的顺序排列,即栈顶元素是最小的。
递减栈通常用于解决一些在遍历数组或序列时需要寻找某个元素的前/后第一个比它小的元素的问题。通过维护一个递减栈,我们可以在遍历数组的过程中,根据当前元素与栈 ...
45. 跳跃游戏 II
给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。
每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:
0 <= j <= nums[i]
i + j < n
返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。
示例 1:
1234>输入: nums = [2,3,1,1,4]>输出: 2>解释: 跳到最后一个位置的最小跳跃数是 2。 从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
示例 2:
12>输入: nums = [2,3,0,1,4]>输出: 2
把该问题比喻为入职,数组下标是公司级别(入职门槛),对应的值是公司级别之上的级别成长空间。你想用最少的跳槽次数入职最高级的公司
数组[2,3,1,2,4,2,3]
下标 0 1 2 3 4 5 6
最开始你没有工作,你的水 ...
763. 划分字母区间
给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。
注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。
返回一个表示每个字符串片段的长度的列表。
示例 1:
123456>输入:s = "ababcbacadefegdehijhklij">输出:[9,7,8]>解释:>划分结果为 "ababcbaca"、"defegde"、"hijhklij" 。>每个字母最多出现在一个片段中。>像 "ababcbacadefegde", "hijhklij" 这样的划分是错误的,因为划分的片段数较少。
示例 2:
12>输入:s = "eccbbbbdec">输出:[10]
代码:
1234567891011121314151617181920212223242526class Solution(object): ...
74. 搜索二维矩阵
给你一个满足下述两条属性的 m x n 整数矩阵:
每行中的整数从左到右按非严格递增顺序排列。
每行的第一个整数大于前一行的最后一个整数。
给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。
示例 1:
12>输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3>输出:true
示例 2:
12>输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13>输出:false
用了比较傻的方法,分行二分查找,也就是在每一行都进行二分查找,最后肯定开销巨大,但是能用
1234567891011121314151617181920212223class Solution(object): def searchMatrix(self, matrix, target): """ : ...