博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode - 33. Search in Rotated Sorted Array
阅读量:6565 次
发布时间:2019-06-24

本文共 1920 字,大约阅读时间需要 6 分钟。

33. Search in Rotated Sorted Array 

 ----------------------------------------------------------------------------

Mean: 

给你一个数组,这个数组是由两个有序的数组拼接成的(无重复元素),在这个数组中查找元素k的下标.

analyse:

既然是由两个有序数组拼接而成,那么只需找到断点,然后进行两次二分查找就行.

Time complexity: O(N)

 

view code

/**
* -----------------------------------------------------------------
* Copyright (c) 2016 crazyacking.All rights reserved.
* -----------------------------------------------------------------
*       Author: crazyacking
*       Date  : 2016-03-01-21.22
*/
#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using
namespace
std;
typedef
long
long(
LL);
typedef
unsigned
long
long(
ULL);
const
double
eps(
1e-8);
class
Solution
{
public
:
   
int
search(
vector
<
int
>&
nums
,
int
target)
   
{
       
int
len
=
nums
.
size();
       
int
low1
=
0
,
high1
=
len
-
1
,
low2
=
0
,
high2
=
len
-
1;
       
for(
int
i
=
1;
i
<
len;
++
i)
       
{
           
if(
nums
[
i
]
<
nums
[
i
-
1
])
           
{
               
high1
=
i
-
1
,
low2
=
i;
               
break;
           
}
       
}
       
if(
high1
==
len
-
1
&&
low2
==
0)
           
return
isExist(
nums
,
low1
,
high2
,
target);
       
else
       
{
           
int
idx1
=
isExist(
nums
,
low1
,
high1
,
target);
           
int
idx2
=
isExist(
nums
,
low2
,
high2
,
target);
           
if(
idx1
==-
1
&&
idx2
==-
1)
               
return
-
1;
           
else
               
return
idx1
!=-
1
?
idx1:
idx2;
       
}
   
}
   
int
isExist(
vector
<
int
>&
nums
,
int
low
,
int
high
,
int
target)
   
{
       
while(
low
<=
high)
       
{
           
int
mid
=(
low
+
high)
>>
1;
           
if(
target
<
nums
[
mid
])
               
high
=
mid
-
1;
           
else
if(
target
>
nums
[
mid
])
               
low
=
mid
+
1;
           
else
return
mid;
       
}
       
return
-
1;
   
}
};
int
main()
{
   
Solution
solution;
   
int n
,
k;
   
vector
<
int
>
ve;
   
while(
cin
>>n
>>
k)
   
{
       
int
tempVal;
       
for(
int
i
=
0;
i
<n;
++
i)
       
{
           
cin
>>
tempVal;
           
ve
.
push_back(
tempVal);
       
}
       
int
ans
=
solution
.
search(
ve
,
k);
       
cout
<<
ans
<<
endl;
   
}
   
return
0;
}
/*
*/

转载于:https://www.cnblogs.com/crazyacking/p/5232699.html

你可能感兴趣的文章
巧用Zabbix自定义监控Mysql性能状态
查看>>
UIKeyboard键盘相关知识点-IOS开发
查看>>
你真的会 snapshot 吗? - 每天5分钟玩转 OpenStack(163)
查看>>
onAttachedToWindow和onDetachedFromWindow调用时机源码解析
查看>>
虚拟机外接USB设备情况的vMotion问题
查看>>
Mysql数据库大小查询
查看>>
#78 Reimplement Trampoline
查看>>
使用Java制作图文验证码
查看>>
java 代理
查看>>
数据库设计三范式
查看>>
Eclipse插件开发- view to view drag drop
查看>>
Linux 技巧:让进程在后台可靠运行的几种方法
查看>>
根据Servlet的Filter自定义实现字符编码过滤器
查看>>
oh-my-zsh安装与配置
查看>>
common lisp asdf
查看>>
git修改远程仓库地址
查看>>
Guess the number
查看>>
iscsi网络存储
查看>>
团队随笔
查看>>
Java内存块说明
查看>>