自从做完leetcode上的三道关于二分查找的题后,我觉得它是比链表找环还恶心的题,首先能写出bugfree代码的人就不多,而且可以有各种变形,适合面试的时候不断挑战面试者,一个程序猿写代码解决问题的能力都能在这个过程中考察出来。

在有序数组中寻找等于target的数的下标,没有的情况返回应该插入的下标位置 :http://oj.leetcode.com/problems/search-insert-position/

public int searchInsert(int[] A, int target) {
// Note: The Solution object is instantiated only once and is reused by each test case.
int start = ;
int end = A.length-; while(start<=end){ // 小于等于
int mid = start + (end-start)/;
if(A[mid]<target)
start = mid+; // mid加1
else if(A[mid]>target)
end = mid-; // mid减1
else
return mid;
} return start;
}

在不重复的旋转数组中寻找等于target的数的下标,没有的话返回-1 :http://oj.leetcode.com/problems/search-in-rotated-sorted-array/

class Solution {
public:
int search(int A[], int n, int target) {
if(n<=)
return -;
int mid;
int start=;
int end=n-;
while(start<=end)
{
mid=(start+end)/;
if(A[mid]==target)
return mid;
else if(A[mid]>=A[start])
{
if(target>=A[start]&&target<A[mid])
end=mid-;
else
start=mid+;
}
else
{
if(target>A[mid]&&target<=A[end])
start=mid+;
else
end=mid-;
}
}
return -;
}
};

在有重复的旋转数组中判断是否存在等于target的数 :http://oj.leetcode.com/problems/search-in-rotated-sorted-array-ii/

class Solution {
public:
bool search(int A[], int n, int target) {
if(n==)
return false;
int mid;
int start=;
int end=n-;
while(start<=end)
{
mid=(start+end)/;
if(A[mid]==target)
return true;
else if(A[mid]>A[start])
{
if(target<A[mid]&&target>=A[start])
end=mid-;
else
start=mid+;
}
else if(A[mid]<A[start])
{
if(target>A[mid]&&target<=A[end])
start=mid+;
else
end=mid-;
}
else
start++;
}
return false;
}
};

旋转数组中查找最小值,当没有重复元素时:https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/

class Solution {
public:
int findMin(vector<int> &num)
{
if(num.empty())
return ;
int s=;
int t=num.size()-;
int mid;
while(s<t)
{
if(num[s]<num[t])
return num[s]; //减少查找次数
mid=(s+t)/;
if(num[mid]<num[t])
t=mid;
else
s=mid+;
}
return num[s];
}
};

在有重复元素的时候,查找旋转数组中的最小值:https://leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/

class Solution {
public:
int findMin(vector<int> &num)
{
if(num.empty())
return ;
int s=;
int t=num.size()-;
while(s<t)
{
if(num[s]<num[t])
return num[s];
int mid=(s+t)/;
//如果存在重复元素时,进行顺序查找
if(num[s]==num[t]&&num[s]==num[mid])
{
int minValue=num[s];
while(s<t)
{
if(num[s]<minValue)
minValue=num[s];
s++;
}
return minValue;
}
if(num[mid]>=num[s])
s=mid+;
else
t=mid;
}
return num[s];
}
};

leetcode二分查找问题整理的更多相关文章

  1. leetcode 二分查找

    https://oj.leetcode.com/problems/search-for-a-range/就是一个二分查找,没事练练手 public class Solution { public in ...

  2. [leetcode]二分查找总结

    Search for a Range 1.最简单的想法,用最普通的二分查找,找到target,然后向左右扩张,大量的重复的target,就会出现O(n)效率. class Solution { pub ...

  3. leetcode 二分查找 Search in Rotated Sorted ArrayII

    Search in Rotated Sorted Array II Total Accepted: 18500 Total Submissions: 59945My Submissions Follo ...

  4. Leetcode 二分查找 Search Insert Position

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie Search Insert Position Total Accepted: 14279 T ...

  5. leetcode 二分查找 Search in Rotated Sorted Array

    Search in Rotated Sorted Array Total Accepted: 28132 Total Submissions: 98526My Submissions Suppose ...

  6. LeetCode 二分查找模板 II

    模板 #2: int binarySearch(vector<int>& nums, int target){ if(nums.size() == 0) return -1; in ...

  7. LeetCode 二分查找模板 I

    模板 #1: int binarySearch(vector<int>& nums, int target){ if(nums.size() == 0) return -1; in ...

  8. LeetCode 二分查找模板 III

    模板 #3: int binarySearch(vector<int>& nums, int target){ if (nums.size() == 0) return -1; i ...

  9. leetcode二分查找相关

    目录 33/81搜索旋转排序数组 34在排序数组中查找元素的第一个和最后一个位置 35搜索插入位置 74搜索二维矩阵 300最长上升子序列,354俄罗斯套娃信封问题 33/81搜索旋转排序数组 假设按 ...

随机推荐

  1. js 剪切板应用clipboardData

    http://blog.csdn.net/fox123871/article/details/6454634 <a href="http://blog.csdn.net/fox1238 ...

  2. 以Akka为示例,介绍Actor模型

    许多开发者在创建和维护多线程应用程序时经历过各种各样的问题,他们希望能在一个更高层次的抽象上进行工作,以避免直接和线程与锁打交道.为了帮助这些开发者,Arun Manivannan编写了一系列的博客帖 ...

  3. 前N个自然数的随机置换

    来自:[数据结构与算法分析——C语言描述]练习2.7 问题描述:假设需要生成前N个自然数的一个随机置换.例如,{4,1,2,5,2}和{3,1,4,2,5}就是合法的置换,但{5,4,1,2,1}却不 ...

  4. CircleLayout

    CircleLayout https://developer.apple.com/library/ios/samplecode/CircleLayout/Introduction/Intro.html ...

  5. Cloud_panel

    传统基础架构应用程序的系统架构师,云计算应用程序的设计确实是相当有挑战性的工作.体现在应用程序架构师首先要了解云计算环境和传统基础架构的差异并且充分利用云计算平台的一些特点来更好的满足用户需求. 对于 ...

  6. Ajax禁止缓存的几个解决方案

    最常用的方法是 方法1:服务器端代码加入  代码如下 复制代码 response.setHeader("Cache-Control", "no-cache, must-r ...

  7. Docker 入门教程(转)

    add by zhj: 可以简单的认为docker是对LXC(Linux Container)封装,它提供一种比LXC高级的API.Docker使用Go语言开发,利用了Linux提供的LXC,AUFS ...

  8. 使用「max-height」实现自适应高度

    .tab-content{ max-height: 0; overflow: hidden; -webkit-transition: max-height .8s; -moz-transition: ...

  9. <转载>linux下内存泄露查找、BUG调试

    先收藏着,抽空好好看看:http://www.ibm.com/developerworks/cn/linux/l-pow-debug/ 简介 调试程序有很多方法,例如向屏幕上打印消息,使用调试器,或者 ...

  10. Linux下的grep搜索命令详解(一)

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局正则表达 ...