二分查找、变形及应用

[LeetCode] 35 Search Insert Position

题目

Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.You may assume no duplicates in the array.

测试案例

Input: [1,3,5,6], 5
Output: 2Input: [1,3,5,6], 2
Output: 1Input: [1,3,5,6], 7
Output: 4Input: [1,3,5,6], 0
Output: 0

代码如下

class Solution {public int searchInsert(int[] nums, int target) {int start = 0, end = nums.length - 1, mid;while(start <= end){mid = (start + end) >> 1;if(nums[mid] == target){return mid;}else if(nums[mid] > target){end = mid - 1;}else{start = mid + 1;}}return start;        }   
}

[LeetCode 34] Find First and Last Position of Element in Sorted Array

题目

Given an array of integers nums sorted in ascending order, find the starting and ending position of a given target value.Your algorithm's runtime complexity must be in the order of O(log n).If the target is not found in the array, return [-1, -1].

测试案例

Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]Input: nums = [5,7,7,8,8,10], target = 6
Output: [-1,-1]

代码如下

class Solution {public int[] searchRange(int[] nums, int target) {        int[] res = new int[2];if(nums.length == 0){res[0] = res[1] = -1;return res;}res[0] = find(nums, target, true);res[1] = find(nums, target, false);if(res[0] >= nums.length || nums[res[0]] != target){res[0] = -1;res[1] = -1;}return res;}int find(int[] nums, int target, boolean left){int mid;int start = 0, end = nums.length - 1;while(start <= end){mid = (start + end) >> 1;if(nums[mid] > target){end = mid - 1;}else if(nums[mid] == target){if(left){end = mid - 1;}else{start = mid + 1;}}else{start = mid + 1;}}return left ? start : end;}
}

[LeetCode 153] Find Minimum in Rotated Sorted Array

题目

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e.,  [0,1,2,4,5,6,7] might become  [4,5,6,7,0,1,2]).
Find the minimum element.You may assume no duplicate exists in the array.

测试案例

Input: [3,4,5,1,2] 
Output: 1Input: [4,5,6,7,0,1,2]
Output: 0

代码如下

class Solution {public int findMin(int[] nums) {int n = nums.length, start = 0, end = n - 1, mid;while(start < end){if(nums[start] < nums[end]){return nums[start];}mid = (start + end) >> 1;if(nums[mid] >= nums[start]){start = mid + 1;}else{end = mid;}}return nums[start];}
}

[LeetCode 74] Search a 2D Matrix

题目

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
- Integers in each row are sorted from left to right.
- The first integer of each row is greater than the last integer of the previous row.

测试案例

Input:
matrix = [[1,   3,  5,  7],[10, 11, 16, 20],[23, 30, 34, 50]
]
target = 3
Output: trueInput:
matrix = [[1,   3,  5,  7],[10, 11, 16, 20],[23, 30, 34, 50]
]
target = 13
Output: false

思路

矩阵的特点是当进行两层循环遍历,外层为行,内层为列时,矩阵中所有元素都是递增的。所以进行如下两层二分查找:

  1. 先在第一列中进行二分。找出 target 或者找出其所有的行。当二分查找的返回值为 -1时,表示矩阵中不存在 target。
  2. 在上次二分查找返回的行中再次二分。

代码如下

class Solution {public boolean searchMatrix(int[][] matrix, int target) {int m, n;if((m = matrix.length) == 0 || (n = matrix[0].length) == 0){return false;}//在第一列中搜索,找出 target 所在的行end。int start = 0, end = m - 1, mid;while(start <= end){mid = (start + end) >> 1;if(matrix[mid][0] == target){return true;}else if(matrix[mid][0] > target){end = mid - 1;}else{                start = mid + 1;}}int pos = end;if(pos == -1){return false;}for(start = 0, end = n - 1; start <= end;){mid = (start + end) >> 1;if(matrix[pos][mid] == target){return true;}else if(matrix[pos][mid] > target){end = mid - 1;}else{start = mid + 1;}}return false;}
}

[LeetCode 240] Search a 2D Matrix II

题目

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:Integers in each row are sorted in ascending from left to right.
Integers in each column are sorted in ascending from top to bottom.

测试案例

[[1,   4,  7, 11, 15],[2,   5,  8, 12, 19],[3,   6,  9, 16, 22],[10, 13, 14, 17, 24],[18, 21, 23, 26, 30]
]
Given target = 5, return true.
Given target = 20, return false.

思路

  1. 每次在矩阵的左边一列进行二叉查找,若查找到 target,返回 true。否则设查找结束后返回值为end。end = -1时,直接返回false。
  2. 取出子矩阵 [0 ~ end][1~ n - 1]。
  3. 重复上述过程共 n 次(因为每查找一次,矩阵列数减1)。
  4. 时间复杂度为 \(O(nlgm)\)。当 n > m时,先在列中进行二分查找。

代码如下

class Solution {public boolean searchMatrix(int[][] matrix, int target) {int m, n, start, end, mid;//初始化 m 和 nif((m = matrix.length) == 0 || (n = matrix[0].length) == 0){reutrn false;               }        //初始化start 和 mid start = 0;end = m - 1;//进行 n 次 二分查找for(int i = 0; i < n; i ++){start = 0;while(start <= end){mid = (start + end) >> 1;if(matrix[mid][i] == target){return true;}else if(matrix[mid][i] < target){start = mid + 1;}else{end = mid - 1;}}if(end == -1){break;}}        reutrn false;}
}

转载于:https://www.cnblogs.com/echie/p/9592186.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396966.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux内核怎么修改屏幕旋转方向_树莓派4—屏幕旋转

配置&#xff1a;树莓派4raspberry pi系统&#xff0c;HDMI显示&#xff0c;非触屏。问题&#xff1a;想将屏幕旋转90&#xff0c;按网上说的&#xff0c;方法一&#xff1a;在config.txt文件中添加display_rotate1&#xff0c;或者添加display_hdmi_rotate1&#xff0c;保存后…

周记随笔-php5.6与apache2.4的windows32安装

原材料&#xff1a;php.net , httpd.apache.org/download.cgi Apache的安装 &#xff0c;在下载页面有依赖关系的说明 。 下载对应版本的压缩包&#xff0c;解压至目标目录&#xff0c;例如D盘根目录&#xff0c;首先修改配置 1 serverRoot: ServerRoot "c:/Apache24"…

独家直播!阿里移动前端开源框架Weex揭秘

或许你写过了很多行代码&#xff0c;修过许多的bug&#xff0c;学过各种各样的语言&#xff0c;却只在一个最好的时机遇见了他…… 是啥&#xff1f; 敲&#xff01;黑&#xff01;板&#xff01;跟&#xff01;我&#xff01;念&#xff01;Weex&#xff5e;&#xff5e;&…

python异常值处理实例_利用Python进行异常值分析实例代码

前言 异常值是指样本中的个别值&#xff0c;也称为离群点&#xff0c;其数值明显偏离其余的观测值。常用检测方法3σ原则和箱型图。其中&#xff0c;3σ原则只适用服从正态分布的数据。在3σ原则下&#xff0c;异常值被定义为观察值和平均值的偏差超过3倍标准差的值。P(|x−μ|…

MSSQL 发布订阅,实现读写分离

主库做增删改&#xff0c;从库只读。 大部分的数据库压力&#xff0c;都是由查询引起的&#xff0c;读写分离可以减轻数据库的压力。 1、在(主)数据库上对需要同步的数据进行发布。 2、在(从)数据库上对(主)数据库的发布进行订阅。 注&#xff1a;发布订阅都需要实际的服务器名…

php get为空,php – $_GET在url有变量时为空

我有一个看起来像这个reglph的文件&#xff1f;lang no_NO& passkey test并试图获取密码变量,但它一直显示为空白.当我尝试print_r($_ GET);它打印Array()?!怎么会发生这种情况&#xff1f;该网站看起来像这样print_r($_GET);include(..\libs\Smarty.class.php);?>A…

Block

1、认识Block Block封装了一段代码,可以在任何时候执行Block可以作为函数参数或者函数的返回值&#xff0c;而其本身又可以带输入参数或返回值&#xff0c;它和传统的函数指针很类似&#xff0c;但是有区别&#xff1a;block是inline&#xff08;内联函数&#xff09;的&#x…

坚持学习WF(8):本地服务之调用外部方法

WF提供了一组核心服务&#xff0c;例如在SQL 数据库中存储工作流实例的执行详细信息的持久性服务&#xff0c;计划服务&#xff0c;事务服务和跟踪服务。除了这些WF也提供了另外一种服务&#xff0c;叫做Local Service也可以叫做Data exchange service。主要是实现工作流和宿主…

c++归并排序_合并排序法

一、合并排序(Merge Sort) 就是将多个有序数据表合并成一个有序数据表。如果参与合并的只有两个有序表&#xff0c;那么称为二路合并。对于一个原始的待排序序列&#xff0c;往往可以通过分割的方法来归结为多路合并排序。二、一个待排序的原始数据序列进行合并排序的基本思路是…

golang json数组拼接

2016年06月16日 15:38:25 阅读数&#xff1a;2575 标签&#xff1a; golang json 数组 更多 个人分类&#xff1a; golang func main() {a : []byte({"Parents": [ "aaaaa", "bbbbbbb" ]})b : []byte({"Parents": [ "Gomez"…

php课程设计实验心得,PHP程序设计教程实验及课程设计

部分 教程1 基础教程1.1 简介1.2 WampServer安装1.3 PHP语法1.4 变量1.5 echo和print语句1.6 数据类型1.7 字符串函数1.8 常量1.9 运算符1.10 条件语句1.11 Switch语句1.12 循环语句1.13 函数部分 教程1 基础教程1.1 简介1.2 WampServer安装1.3 PHP语法1.4 变量1.5 echo和print…

DRUID连接池的简单使用

DRUID——为监控而生的DB池 1. DRUID介绍 DRUID是阿里巴巴开源平台上一个数据库连接池实现&#xff0c;它结合了C3P0、DBCP、PROXOOL等DB池的优点&#xff0c;同时加入了日志监控&#xff0c;可以很好的监控DB池连接和SQL的执行情况&#xff0c;可以说是针对监控而生的DB连接池…

微习惯虽好,但是最重要的还是坚持

2019独角兽企业重金招聘Python工程师标准>>> “微习惯”一词是由美国的斯蒂芬盖斯提出的。他以前是个宅男&#xff0c;懒虫&#xff0c;为了改变自己而找到了这个方法。并且在自己身上实验成功。养成了好的读书、写作和健身的习惯&#xff0c;实现了人生的华丽转身。…

php手机端多图预览上传,JS实现多图预览上传的实例代码

这篇文章主要介绍了JS实现多张图片预览同步上传功能的相关资料,需要的朋友可以参考下废话不多说了&#xff0c;直接给大家贴代码了&#xff0c;具体代码如下所示&#xff1a;/*** Created by liujing on 2017/5/10.*/$(document).ready(function($) {function changef(which,bu…

带你了解zabbix整合ELK收集系统异常日志触发告警~

今天来了解一下关于ELK的“L”-Logstash,没错&#xff0c;就是这个神奇小组件&#xff0c;我们都知道&#xff0c;它是ELK不可缺少的组件&#xff0c;完成了输入&#xff08;input&#xff09;&#xff0c;过滤&#xff08;fileter&#xff09;&#xff0c;output&#xff08;输…

用python设计学生管理系统_Python实现GUI学生信息管理系统

本文实例为大家分享了Python实现GUI学生信息管理系统的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下 项目环境&#xff1a; 软件环境: OS:RedHat6.3 Lib:Pygtk Language:Python Support tool:Glade3 项目简述&#xff1a; ①Glade3设计用户的登录窗口&#xff0c;功…

http响应头设置

protected void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 设置响应头数据response.setHeader(null, "HTTP/1.1 200 OK");response.setHeader("Server", "Apache-Coyote/1.1"…

java用数组实现单词计数,MapReduce实现单词计数原理及Java编程:WordCount

MapReduce实现单词计数&#xff1a;WordCount单词计数的文本信息(hello.txt)&#xff1a;hello can i help youi have a dreammaybe you can help me​ 实现过程&#xff1a;​ Map过程&#xff1a;并行读取文本&#xff0c;对读取的单词进行Map操作&#xff0c;每个词将会形成…

python理论知识选择题_Python基础自测题答案和基础知识梳理

Python基础自测题答案和基础知识梳理 1.关于Python中的lambda表达式的函数体自能是单独一条语句&#xff0c;所以答案选择C。 例如&#xff1a;>>>g lambda x: 2*x1 g(3) 7 2.Python中的变量不需要事先声明&#xff0c;但是需要创建和赋值&#xff0c;否则你怎么用&a…

STM32f4 ARM Bootloader

参考资料&#xff1a; 基于ARM 的嵌入式系统Bootloader 启动流程分析 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计) Android系统启动流程 -- bootloader 在main()之前&#xff0c;IAR都做了啥&#xff1f; STM32 IAP程序 源码 和测试代码 有详细的…