
二分法
枫流仁武
这个作者很懒,什么都没留下…
展开
-
LeetCode 153 寻找旋转排序数组的最小值
已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]若旋转 4 次,则可以得到 [0,1,2,4,5,6,7]注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。给你一个元素值 互不相同 的数组原创 2021-04-08 08:06:45 · 201 阅读 · 0 评论 -
LeetCode 354 俄罗斯套娃信封问题
给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。请计算 最多能有多少个 信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。注意:不允许旋转信封。示例 1:输入:envelopes = [[5,4],[6,4],[6,7],[2,3]]输出:3解释:最多信封的个数为 3, 组合为:.原创 2021-03-05 19:19:47 · 171 阅读 · 0 评论 -
LeetCode 1208 尽可能使字符串相等
给你两个长度相同的字符串,s 和 t。将 s中的第i个字符变到t中的第 i 个字符需要|s[i] - t[i]|的开销(开销可能为 0),也就是两个字符的 ASCII 码值的差的绝对值。用于变更字符串的最大预算是maxCost。在转化字符串时,总开销应当小于等于该预算,这也意味着字符串的转化可能是不完全的。如果你可以将 s 的子字符串转化为它在 t 中对应的子字符串,则返回可以转化的最大长度。如果 s 中没有子字符串可以转化成 t 中对应的子字符串,则返回 0。双指针法:...原创 2021-02-06 10:38:32 · 141 阅读 · 0 评论 -
LeetCode 34 在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回[-1, -1]。本题很明显是利用二分法来解决。直接调用系统函数:from typing import *import bisectclass Solution: def searchRange(self, nums: List[int], target: int) -> List[int]: i.原创 2020-12-01 09:19:08 · 119 阅读 · 0 评论 -
LeetCode 493 翻转对
给定一个数组nums,如果i < j且nums[i] > 2*nums[j]我们就将(i, j)称作一个重要翻转对。你需要返回给定数组中的重要翻转对的数量。首先给出二分搜索算法的解法:class Solution: def reversePairs(self, nums: List[int]) -> int: arr = [] res = 0 for val in nums[::-1]: ...原创 2020-11-28 15:10:55 · 76 阅读 · 0 评论 -
LeetCode 327 区间和的个数
给定一个整数数组nums,返回区间和在[lower, upper]之间的个数,包含lower和upper。区间和S(i, j)表示在nums中,位置从i到j的元素之和,包含i和j(i ≤ j)。肯定是想要得到一个NlogN的方法。这道题可以采用归并,线段树,树状数组等方法,这里给出二分搜索题解。from typing import *import bisectclass Solution: def countRangeSum(self, n...原创 2020-11-07 11:16:30 · 180 阅读 · 0 评论 -
LeetCode 1300 转变数组后最接近目标值的数组和
给你一个整数数组arr 和一个目标值target ,请你返回一个整数value,使得将数组中所有大于value 的值变成value 后,数组的和最接近target(最接近表示两者之差的绝对值最小)。如果有多种使得和最接近target的方案,请你返回这些整数中的最小值。双重二分搜索:from typing import *import bisectclass Solution: """ 双重二分搜索 """ def findBest...原创 2020-09-14 19:50:53 · 69 阅读 · 0 评论 -
LeetCode 378 有序矩阵中第K小的元素
给定一个n x n矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。这道题和之前的搜索二维矩阵2类似。都是从矩阵的左下角开始遍历。第k小的元素有一个范围,在最大值和最小值之间进行二分搜索。from typing import *class Solution: def check(self, matrix, val): ''' 找到矩阵中小于等于val元素的个数 :param matrix: :param...原创 2020-09-14 16:17:09 · 108 阅读 · 0 评论 -
LeetCode 718 最长重复子数组
给两个整数数组A和B,返回两个数组中公共的、长度最长的子数组的长度。A: [1,2,3,2,1]B: [3,2,1,4,7]数组+长度,这种问题看来很多都可以采用二分搜索算法,因为长度有一个范围。搜索可能的长度,针对某个长度的字符串,找到原字符串所有子串对应的哈希值。再去哈希另一个字符串。from typing import *class Solution: def findLength(self, A: List[int], B: List[int]) ->...原创 2020-09-13 18:15:31 · 97 阅读 · 0 评论 -
LeetCode 300 最长上升子序列
给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4解释: 最长的上升子序列是[2,3,7,101],它的长度是 4。平方时间复杂度的算法十分简单,简单的动态规划,但是该算法复杂度可以控制在。贪心法和二分算法结合。from typing import *class Solution: def lengthOfLIS(self, nums: List[int]) -> int: ..原创 2020-09-13 17:57:45 · 75 阅读 · 0 评论 -
LeetCode 719 找出第k小距离对
给定一个整数数组,返回所有数对之间的第 k 个最小距离。一对 (A, B) 的距离被定义为 A 和 B 之间的绝对差值。二分查找和双指针。from typing import *class Solution: def smallestDistancePair(self, nums: List[int], k: int) -> int: nums.sort() max_val = nums[-1] - nums[0] min_val原创 2020-09-12 17:40:37 · 131 阅读 · 0 评论 -
LeetCode 154 寻找旋转排序数组中的最小值2
from typing import *import sysclass Solution: def findMin(self, nums: List[int]) -> int: lo, hi = 0, len(nums) - 1 min_val = sys.maxsize while lo <= hi: mid = (lo + hi) // 2 min_val = min(min_va.原创 2020-09-12 15:54:30 · 66 阅读 · 0 评论 -
LeetCode 410 分割数组的最大值
给定一个非负整数数组和一个整数m,你需要将这个数组分成m个非空的连续子数组。设计一个算法使得这m个子数组各自和的最大值最小。注意:数组长度n满足以下条件:1 ≤ n ≤ 10001 ≤ m ≤ min(50, n)class Solution: def splitArray(self, nums: List[int], m: int) -> int: lo, hi = -sys.maxsize, 0 for val in num...原创 2020-09-12 09:31:49 · 155 阅读 · 0 评论 -
LeetCode 410 分割数组的最大值
采用二分搜索的方法import sysclass Solution: def splitArray(self, nums: List[int], m: int) -> int: lo,hi=-sys.maxsize,0 for val in nums: hi+=val lo=max(lo,val) res=hi while lo<=hi: mi原创 2020-07-27 14:53:44 · 101 阅读 · 0 评论 -
leetCode 719 找出第k小的距离对
最小的可能值为0,最大可能为最大值减去最小值,二分搜索。from typing import *class Solution: def smallestDistancePair(self, nums: List[int], k: int) -> int: nums.sort() lo,hi=0,nums[-1]-nums[0] while lo<=hi: mid=lo+(hi-lo)//2原创 2020-07-02 09:46:07 · 105 阅读 · 0 评论 -
LeetCode 378 有序矩阵中的第K小的元素
在最大值和最小值之间搜索class Solution: def check(self,matrix,val): m,n=len(matrix),len(matrix[0]) i,j=m-1,0 cnt=0 while i>=0 and j<n: if matrix[i][j]<=val: cnt+=(i+1) j+=1原创 2020-07-02 08:30:21 · 81 阅读 · 0 评论 -
LeetCode 300 最长上升子序列
给定一个整数数组,找到最长上升子序列的长度。利用二分法,思路见官方题解。from typing import *class Solution: def lengthOfLIS(self, nums: List[int]) -> int: dp=[] for val in nums: if not dp or dp[-1]<val: dp.append(val) el原创 2020-06-15 11:16:14 · 101 阅读 · 0 评论 -
LeetCode 14 最长公共前缀
分治法class Solution { public String longestCommonPrefix(String[] strs) { if (strs.length==0){ return ""; } return commonPrefix(strs,0,strs.length-1); } private String commonPrefix(String[] strs,int lo,int hi原创 2020-06-15 08:06:12 · 83 阅读 · 0 评论 -
LeetCode 1300 转变数组后最接近目标值的数组和
参考LeetCode官网的解答。思路:双重二分搜索,第一重搜索value值,value最小值为1,最大值为max(arr)。找到转变后数组和在满足小于target的条件下的最大下标,记为ans,比较ans与ans加一的结果。第二重搜索为在排好序的数组上找到对应值应插入的下标。from typing import *import bisectclass Solution: ''' 双重二分搜索 ''' def findBestValue(sel原创 2020-06-14 15:13:48 · 147 阅读 · 0 评论 -
PAT 1117 Eddington Number
British astronomer Eddington liked to ride a bike. It is said that in order to show off his skill, he has even defined an "Eddington number",E-- that is, the maximum integerEsuch that it is forE...原创 2019-08-22 18:06:49 · 127 阅读 · 0 评论 -
PAT 1085 Perfect Sequence
二分法解决:二分法的题有的时候真的很迷...起初最后一个测试点总也过不去,加了一行之后就成功了~至于为什么加那一行我也不清楚了...#include <algorithm>#include <iostream>#include <vector>typedef long long LL;using namespace std;int B...原创 2019-07-10 14:14:55 · 147 阅读 · 0 评论 -
PAT 1044 Shopping in Mars
Shopping in Mars is quite a different experience. The Mars people pay by chained diamonds. Each diamond has a value (in Mars dollars M$). When making the payment, the chain can be cut at any position ...原创 2019-06-08 16:34:30 · 118 阅读 · 0 评论