leetcode二分查找问题整理
自从做完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二分查找问题整理的更多相关文章
- leetcode 二分查找
https://oj.leetcode.com/problems/search-for-a-range/就是一个二分查找,没事练练手 public class Solution { public in ...
- [leetcode]二分查找总结
Search for a Range 1.最简单的想法,用最普通的二分查找,找到target,然后向左右扩张,大量的重复的target,就会出现O(n)效率. class Solution { pub ...
- leetcode 二分查找 Search in Rotated Sorted ArrayII
Search in Rotated Sorted Array II Total Accepted: 18500 Total Submissions: 59945My Submissions Follo ...
- Leetcode 二分查找 Search Insert Position
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie Search Insert Position Total Accepted: 14279 T ...
- leetcode 二分查找 Search in Rotated Sorted Array
Search in Rotated Sorted Array Total Accepted: 28132 Total Submissions: 98526My Submissions Suppose ...
- LeetCode 二分查找模板 II
模板 #2: int binarySearch(vector<int>& nums, int target){ if(nums.size() == 0) return -1; in ...
- LeetCode 二分查找模板 I
模板 #1: int binarySearch(vector<int>& nums, int target){ if(nums.size() == 0) return -1; in ...
- LeetCode 二分查找模板 III
模板 #3: int binarySearch(vector<int>& nums, int target){ if (nums.size() == 0) return -1; i ...
- leetcode二分查找相关
目录 33/81搜索旋转排序数组 34在排序数组中查找元素的第一个和最后一个位置 35搜索插入位置 74搜索二维矩阵 300最长上升子序列,354俄罗斯套娃信封问题 33/81搜索旋转排序数组 假设按 ...
随机推荐
- effective c++:引用传递与值传递,成员函数与非成员函数
以pass-by-reference-to-const 替换pass-by-value 考虑以下class继承体系 class Person { public: Person(); // parame ...
- CentOS下挂在NTFS分区
本文参考自http://www.cnblogs.com/gbyukg/archive/2011/11/02/2232343.html centos下想访问NTFS分区,现在普遍的方法是利用ntfs-3 ...
- [转]天龙八部的BillingServer
从字面上看,Billing是计费的,应该处理玩家在线时间或者包月之类.但是天龙八部是免费游戏,不需要算时间来计费.从代码中看,BillingServer也比较简单,它有一个连接到Web服务器,并监听一 ...
- What are some good resources for learning about Artificial Neural Networks
http://stackoverflow.com/questions/478947/what-are-some-good-resources-for-learning-about-artificial ...
- ACM 数论小结 2014-08-27 20:36 43人阅读 评论(0) 收藏
断断续续的学习数论已经有一段时间了,学得也很杂,现在进行一些简单的回顾和总结. 学过的东西不能忘啊... 1.本原勾股数: 概念:一个三元组(a,b,c),其中a,b,c没有公因数而且满足:a^2+b ...
- 【Linux笔记】Linux目录结构
[Linux笔记]Linux目录结构 本文内容整理自网络,以作参考. /:根目录,位于linux文件系统目录结构的顶层,一般根目录下只存放目录,不要存放文件,/etc./bin./dev./lib ...
- emWin(ucGui) Edit控件数值模式 ——符号编辑 worldsing
emWin(ucGui) Edit控件数值模式出现负数值编辑时,如果键盘按键全可以设置独立的"-","+"键,这样可以正常编辑正数和负数,但是要没有设置这两个键 ...
- Android反射出一个类中的其他类对象并调用其对应方法
MainActivity如下: package cn.testreflect; import java.lang.reflect.Field; import java.lang.reflect.Met ...
- android打电话、发短信实现
打电话: Intent intent = newIntent(Intent.ACTION_CALL,Uri.parse("tel:"+"156666666666" ...
- Oracle 分区字段数据更新
分区字段是不允许进行update操作的,如果有对分区字段行进update,就会报错——ORA-14402:更新分区关键字列将导致分区的更改. 可以通过打开表的row movement属性来允许对分区 ...