![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法:二分思想
拾牙慧者
会点c++、python;
展开
-
得到前i-1个数中比A[i]小的最大值,使用set,然后二分查找
题目有一个长度为 n 的序列 A,A[i] 表示序列中第 i 个数(1<=i<=n)。她定义序列中第 i 个数的 prev[i] 值 为前 i-1 个数中比 A[i] 小的最大的值,即满足 1<=j<i 且 A[j]<A[i] 中最大的 A[j],若不存在这样的数,则 prev[i] 的值为 0。思路很显然,使用双for循环的复杂度为O(n^2);伪代码如下:for (int i = 1; i < a.size(); i++) { int max = 0原创 2021-08-08 20:46:33 · 394 阅读 · 0 评论 -
二分法变种小结(leetcode 34、leetcode33、leetcode 81、leetcode 153、leetcode 74)
目录二分法细节1、leetcode 34 在排序数组中查找元素的第一个和最后一个位置2、不完全有序下的二分查找(leetcode33. 搜索旋转排序数组)3、含重复元素的不完全有序下的二分查找(81. 搜索旋转排序数组 II)3、不完全有序下的找最小元素(153. 寻找旋转排序数组中的最小值)4、二维矩阵二分(74. 搜索二维矩阵)二分法细节1、计算mid时,不能使用(left + right)/2,否则有可能计算溢出。可以使用下面方法计算:mid = left + ((right - left.原创 2020-12-18 23:25:59 · 362 阅读 · 1 评论 -
leetcode 69. x 的平方根 思考分析
题目实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。示例 1:输入: 4输出: 2示例 2:输入: 8 输出: 2 说明: 8 的平方根是 2.82842…,由于返回类型是整数,小数部分将被舍去。二分法我们要找的是满足 ans * ans <= x 中ans的最大值。以0位左边界,x为右边界开始折半查找满足情况的数。由于题目要求的是向下取整的数,而最后不满足while条原创 2020-12-04 15:36:37 · 319 阅读 · 0 评论 -
详细讲解设计跳表的三个步骤(查找、插入、删除)
目录写在前面跳表概要查找步骤插入步骤删除步骤完整代码写在前面关于跳表的一些知识可以参考这篇文章,最好是先看完这篇文章再看详细的思路->代码的复现步骤:Redis内部数据结构详解(6)——skiplist关于跳表的插入、删除基本操作其实也就是链表的插入和删除,所以如果不熟悉的话还得先回顾链表的插入以及删除是怎样的,可以参考:【数据结构基础笔记】【链表】相关代码以及其他语言的写法或者其他思路可以参考:1206. 设计跳表代码参考链接:https://leetcode-cn.com/p.原创 2020-12-03 23:43:15 · 6337 阅读 · 3 评论 -
leetcode 35. 搜索插入位置 思考分析
目录题目暴力二分迭代二分递归题目给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。示例 1:输入: [1,3,5,6], 5输出: 2示例 2:输入: [1,3,5,6], 2输出: 1示例 3:输入: [1,3,5,6], 7输出: 4示例 4:输入: [1,3,5,6], 0输出: 0暴力class Solution {public: int .原创 2020-12-02 20:40:21 · 176 阅读 · 0 评论 -
二分法:两个有序数组长度为N,找到第N、N+1大的数
题目两个数组长度为N,找到第N、N+1大的数思路1:双指针,O(N)复杂度简述思路:如果当前A指针指向的数组A的内容小于B指针指向的数组B的内容,那么A指针往右移动,然后nums(当前已经遍历过的数字个数)也加一。如果此时已经遍历过的数字个数等于N那么九江移动之前的A指针指向的A数组的内容送入result。其他情况,以相反的逻辑进行。//双指针法求解vector<int> GetMid_On(vector<int>& A, vector<int>&原创 2020-11-30 19:03:48 · 739 阅读 · 2 评论