【刷题记录】
写在前面此系列文章仅是对于自己学习的一个记录,如有错误,望大家谅解给予指正。
第十一次刷题
一、牛客网刷题
1.题目描述:给出一个转动过的有序数组,你事先不知道该数组转动了多少(例如,0 1 2 4 5 6 7可能变为4 5 6 7 0 1 2).在数组中搜索给出的目标值,如果能在数组中找到,返回它的索引,否则返回-1。假设数组中不存在重复项。
2.代码
class Solution {
public:
/**
*
* @param A int整型一维数组
* @param n int A数组长度
* @param target int整型
* @return int整型
*/
int search(int* A, int n, int target) {
// write code here
if(n==1){ //
return target==A[0]?0:-1; //返回索引
}
int left=0,right=n-1; //定义数组长度
while(left<=right){ //寻找分界点
int mid=(left+right)/2;
if(A[mid]==target){
return mid;
}
else if(A[left]<=A[mid]){ //在分界点左部分查找
if(target<A[mid]&&target>=A[left]){
right=mid-1;
}else{
left=mid+1;
}
}else{
if(target>A[mid]&&target<=A[right])//在分界点右部分查找
{
left=mid+1;
}else{
right=mid-1;
}
}
}
return -1;
}
};
3.问题分析:先判断顺序再采用二分查找的方式,先找到中间值,然后进行左右查找。
4.备注:知识点总结
(1)二分查找(折半查找):必须采用顺序存储结构,将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x。