二分查询-leetcode
二分查找-leetcode
/**
*
* 278. First Bad Version
*
* You are a product manager and currently leading a team to develop a new
* product. Unfortunately, the latest version of your product fails the quality
* check. Since each version is developed based on the previous version, all the
* versions after a bad version are also bad.
*
* Suppose you have n versions [1, 2, ..., n] and you want to find out the first
* bad one, which causes all the following ones to be bad.
*
* You are given an API bool isBadVersion(version) which will return whether
* version is bad. Implement a function to find the first bad version. You
* should minimize the number of calls to the API.
*
* note: The isBadVersion API is defined in the parent class VersionControl.
* boolean isBadVersion(int version);
*
*/
public class Lc278 {
/*
* 本题利用二分查找,不同于普通的二分查找,本题是利用二分发找到最先出现的bad code,所以利用折半找到对应位置。
*
* 需要注意的是常规的二分法是利用mid = (left+right)/2;如果left =
* Integer.maxValue,right=Inter.maxValue,就会超过啦 可以用 left + (right-left) 就可以避免以上情况
*/
public static int firstBadVersion(int n) {
int left = 1;
int right = n;
while (right > left) {
int mid = left + (right - left) / 2;
if (isBadVersion(mid)) {
right = mid;
} else {
left = left + 1;
}
}
return left;
}
public static boolean isBadVersion(int version) {
return false;
}
public static void main(String[] args) {
System.out.println(firstBadVersion(5));
}
}
/**
* 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.
*
*
*/
public class Lc35 {
/**
*标准的二分查找题目
*
*
*/
public static int searchInsert(int[] nums, int target) {
if (nums.length == 0) {
return 0;
}
int left = 0;
int right = nums.length;
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] > target) {
right = mid;
} else if (nums[mid] < target) {
left = mid + 1;
}
}
return ++right;
}
public static void main(String[] args) {
int[] nums = { 1, 3 };
int target = 2;
System.out.println(searchInsert(nums, target));
}
}
import java.util.Arrays;
/**
*
* 33. Search 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]).
*
* You are given a target value to search. If found in the array return its
* index, otherwise return -1.
*
* You may assume no duplicate exists in the array.
*
* Your algorithm's runtime complexity must be in the order of O(log n).
*
*/
public class Lc33 {
/**
* 数组之间相互指向是地址指向,值改变双方都是改变
*
*/
public static int search(int[] nums, int target) {
if (nums.length == 0) {
return -1;
}
// 复制到新的空间
int temp[] = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
temp[i] = nums[i];
}
// 排序
Arrays.sort(temp);
int left = 0;
int right = nums.length;
// 记录目标数据在排序后数组中的位置
int position = Integer.MAX_VALUE;
while (left < right) {
int mid = left + (right - left) / 2;
if (target == temp[mid]) {
position = mid;
break;
} else if (temp[mid] > target) {
right = mid;
} else if (temp[mid] < target) {
left = left + 1;
}
}
// 数组中无该数据
if (position == Integer.MAX_VALUE) {
return -1;
}
// 找到目标数据在数组中的位置,找到对应值在原数组的位置
for (int i = 0; i < nums.length; i++) {
if (nums[i] == temp[position]) {
return i;
}
}
return nums.length;
}
public static void main(String[] args) {
int nums[] = { 4, 5, 6, 7, 0, 1, 2 };
int target = 0;
System.out.println(search(nums, target));
}
}
/*
*
* 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.
*/
public class Lc153 {
/*
* 首先对比俩端的数字,如果是左边小于右边,则无需比较,整体是升序;
*
* 如果左边大于右边,如果中间位置的值大于左边,则中间值也在一组升序里面,则需让左边的边界为中间值 同理 右边也是
*/
public static int findMin(int[] nums) {
int left = 0;
int right = nums.length;
if (nums[left] < nums[right - 1]) {
return nums[0];
}
while (left < right - 2) {
int mid = left + (right - left) / 2;
if (nums[mid] > nums[left]) {
left = mid;
} else if (nums[mid] < nums[left]) {
right = mid;
}
}
return nums[right];
}
public static void main(String[] args) {
int[] nums = { 4, 5, 6, 7, 0, 1, 2 };
System.out.println(findMin(nums));
}
}
/*
* We are playing the Guess Game. The game is as follows:
I pick a number from 1 to n. You have to guess which number I picked.
Every time you guess wrong, I'll tell you whether the number is higher or lower.
You call a pre-defined API guess(int num) which returns 3 possible results (-1, 1, or 0):
*/
public class Lc374 {
/*
* guess(int num)
*/
public static int guessNumber(int n) {
int left = 1;
int right = n;
while (left < right) {
int mid = left + (right - left) / 2;
int res = guess(mid);
if (res == 0) {
return mid;
} else if (res == -1) {
right = mid-1;
} else if (res == 1) {
left = mid+1;
}
}
return n;
}
private static int guess(int num) {
if (num < 2) {
return -1;
}
if (num > 2) {
return 1;
}
return 0;
}
public static void main(String[] args) {
System.out.println(guessNumber(2));
}
}
二分查询-leetcode的更多相关文章
- C# 二分查询
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 【洛谷P2894】Hotel 线段树+二分查询
题目大意:给定一个长度为 N 的序列,每个点有两种状态 1/0,表示占有和空闲,现支持 first-fit 查询是否有一段连续的长度为 X 的空闲子序列和区间赋值操作. 题解:get到了线段树新技能. ...
- codeforces 633D - Fibonacci-ish 离散化 + 二分查询
Fibonacci-ish Yash has recently learnt about the Fibonacci sequence and is very excited about it. He ...
- bzoj1257 数学整理二分查询
2013-11-15 21:55 原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1257 要求求sigma k mod i(i<=n) ...
- sql 中多表查询-leetcode : Combine Two Tables
因为对数据库的内容早都忘得差不多了,所以我的第一感觉是: select Person.FirstName, Person.LastName, Address.City from Person, Add ...
- Light oj 1138 - Trailing Zeroes (III) (二分)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1138 题目就是给你一个数表示N!结果后面的0的个数,然后让你求出最小的N. 我们可以知 ...
- noip 2012 借教室 (线段树 二分)
/* 维护区间最小值 数据不超int 相反如果long long的话会有一组数据超时 无视掉 ll int */ #include<iostream> #include<cstdio ...
- 编程内功修炼之数据结构—BTree(二)实现BTree插入、查询、删除操作
1 package edu.algorithms.btree; import java.util.ArrayList; import java.util.List; /** * BTree类 * * ...
- 湖南省第十一届大学生程序设计竞赛:Internet of Lights and Switches(HASH+二分+异或前缀和)
Internet of Lights and Switches Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 3 Solved: 3[Submit][ ...
随机推荐
- java程序员面试答题技巧
答题时,先答是什么,再答有什么作用和要注意什么(这部分最重要,展现自己的心得) 答案的段落分别,层次分明,条理清晰都非常重要,从这些表面的东西也可以看出一个人的 习惯.办事风格.条理等. 要讲你做出答 ...
- 使用 colgroup 和 col 实现响应式表格
Table 在项目使用中十分频繁,特别是在后台管理系统中,table 无疑是数据展示的第一公民,在早些年的网页中,table 也是网页布局的第一选择,然后使用好 table 并不容易,其它有很多子元素 ...
- JS前端将table导出到excel 兼容谷歌 IE 且保留表格样式
CDSN上博主给我一段代码,可将表格导出为EXCEL文档,原文见: https://blog.csdn.net/zz210891470/article/details/94717644 向博主学习.致 ...
- 网页采集器-UA伪装
网页采集器-UA伪装 UA伪装 请求载体身份标识的伪装: User-Agent: 请求载体身份标识,通过浏览器发起的请求,请求载体为浏览器,则该请求的User-Agent为浏览器的身份标识,如果使用爬 ...
- flex布局实现瀑布流排版
网上有很多有关js(jq)实现瀑布流和有关瀑布流的插件很多,例如:插件(Masonry,Wookmark等等).按照正常的逻辑思维,瀑布流的排版(item列表)一般都是 由左到右,上而下排序的结果,单 ...
- Apache用户认证、域名跳转、Apache访问日志
5月29日任务 课程内容: 11.18 Apache用户认证11.19/11.20 域名跳转11.21 Apache访问日志扩展 apache虚拟主机开启php的短标签 http://ask.apel ...
- C# 轮流展示照片
代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; u ...
- 使用Navicat连接阿里云服务器中的Mysql数据库
1.首先将阿里云服务器中的安全组添加上Mysql的端口3306,如下图所示: 步骤就是进入到阿里云的官网,点击右上角控制台,在左边选择云服务器ECS--->实例 点击图中的管理按钮,然后选择本实 ...
- TCP 的三次握手,四次挥手和重要的细节—干货满满,建议细读
最近把个人博客搭建好了,链接在这里:tobe的呓语,文章会先在博客和公众号更新~ 大家多多收藏啊 上一次讲了 UDP 协议,从这次开始,就要讲 TCP 协议了,因为 TCP 协议涉及到的东西很多,一篇 ...
- js之观察者模式和发布订阅模式区别
观察者模式(Observer) 观察者模式指的是一个对象(Subject)维持一系列依赖于它的对象(Observer),当有关状态发生变更时 Subject 对象则通知一系列 Observer 对象进 ...