LeetCode之搜索旋转排序数组
介绍
假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。
示例1:
输入: nums = [4,5,6,7,0,1,2], target = 0
输出: 4
示例2:
输入: nums = [4,5,6,7,0,1,2], target = 3
输出: -1
源代码:
class Solution {
public:int search(vector<int>& nums, int target) {int start = 0, end = nums.size()-1;while(start <= end){if(target == nums[start]) return start;if(target == nums[end]) return end;int middle = (start + end)/2;if(target == nums[middle])return middle;if(nums[start] > nums[middle]){if(target > nums[middle] && nums[start] > target)start = middle + 1;elseend = middle - 1;} else {if(target < nums[middle] && target > nums[start])end = middle - 1;elsestart = middle + 1;}}return -1;}
};
除了这个简洁的,还有一个稍长的代码,基本思想是,首先确定在哪一个位置上进行旋转的,然后分成两部分,依次进行二分查找。
#include <iostream>
#include<vector>
#include<algorithm>using namespace std;int search(vector<int>& nums, int target)
{int left = 0;int right = nums.size() - 1;int middle;int tmp;if (nums.size() == 0){return -1;}if (nums.size() == 1){if (nums[0] == target) return 0;else return -1;}if (nums.size() == 2){if (nums[0] == target) return 0;else if (nums[1] == target) return 1;else return -1;}for (int i = 0; i < nums.size()-1; i++){if (nums[i] > nums[i + 1]){tmp = i+1;}}if (tmp!=NULL){if (target <= nums[tmp - 1] && target >= nums[0]){left = 0;right = tmp - 1;while (left < right){if (nums[left] == target){return left;}else if (nums[right] == target){return right;}middle = left+(right - left) / 2;if (nums[middle] == target){return middle;}else if (nums[middle] > target){right = middle;}else if (nums[middle] < target){left = middle;}}}else if (target >= nums[tmp] && target <= nums[nums.size() - 1]){left = tmp;right = nums.size() - 1;while (left < right){if (nums[left] == target){return left;}else if (nums[right] == target){return right;}middle = left + (right - left) / 2;if (nums[middle] == target){return middle;}else if (nums[middle] > target){right = middle;}else if (nums[middle] < target){left = middle;}}}}else if (tmp == NULL){cout << "cuiwei" << endl;left = 0;right = nums.size() - 1;while (left < right){if (nums[left] == target){return left;}else if (nums[right] == target){return right;}middle = left + (right - left) / 2;if (nums[middle] == target){return middle;}else if (nums[middle] > target){right = middle;}else if (nums[middle] < target){left = middle;}}}return -1;
}int main()
{vector<int> nums = {1,3,5};int target = 1;int result = search(nums,target);cout << result << endl;system("pause");return 0;
}
LeetCode之搜索旋转排序数组相关推荐
- LeetCode.M33.搜索旋转排序数组
LeetCode.M33 题目: 题目大意: 将一个严格升序且没有重复元素的数组的后半部分(从k处开始)移动到前半部分,进过这个操作变成一个新的数组,然后在这个一个新的数组中查找某个元素targe ...
- LeetCode—33. 搜索旋转排序数组
33. 搜索旋转排序数组 题目描述:整数数组 nums 按升序排列,数组中的值 互不相同 . 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length ...
- LeetCode 33. 搜索旋转排序数组 golang
33. 搜索旋转排序数组 三个测试用例, 这个题的难度是二分法的左侧条件很难写出来. 4 5 6 0 1 2 3 1 2 3 4 5 6 0 5 1 2 3 4 ( 例如,数组 [0,1,2,4,5, ...
- leetcode —— 33. 搜索旋转排序数组
假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目标值, ...
- leetcode 33 搜索旋转排序数组 到处是细节的好题
这个题想了想就会做,只是细节真的能卡死人,找了好久的bug.甚至我怀疑我现在的代码可能还有错,只是没例子测出来. 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2, ...
- LeetCode 33. 搜索旋转排序数组(二分查找)
1. 题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在 ...
- LeetCode 81 搜索旋转排序数组 II
题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转.( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ).编写一个函数来判断给定的目标值是否存在于数 ...
- 59. Leetcode 81. 搜索旋转排序数组 II(二分查找-局部有序)
已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同.在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 ,使 ...
- Leetcode 33.搜索旋转排序数组 (每日一题 20210707)
整数数组 nums 按升序排列,数组中的值 互不相同 .在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [num ...
- leetcode 81. 搜索旋转排序数组 II(二分查找)
已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 , ...
最新文章
- 开发自己的山寨Android注解框架
- mp4文件时长 c++源码_【C语言】如何使用头文件 .h 编译 C 源码!so easy!
- PolarFS :一个用于共享存储云数据库的超低延迟和容错分布式文件系统
- idea怎么直接拉去git_如何将GitHub上面的项目拉取到IDEA中
- 获取select被选中的option的值
- tcp的发送端一个小包就能打破对端的delay_ack么?
- java中自定义异常的_java中的自定义异常(标准)
- [转载] java中关于用\t格式输出
- 查看你某条sql是哪个用户执行的_django_debug_toolbar:查看访问某个页面执行sql的详细...
- c语言指针的地址存放,c语言 - *指针 和 地址
- 电脑端用起来特别爽的四款软件,哪一款才是你的最爱?
- HDU1813:Escape from Tetris(IDA)
- 产品研发过程管理专题——产品需求分析原则一
- Tomcat启动Maven项目异常:java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext
- Oracle数据库索引原理分析
- Java多线程:同步集合与同步锁
- 第十二章 采购管理 采购合同类型以及其区别 合同类型与风险分担 自制与外购分析 招标文件 工作说明书(SOW) 工作大纲 (TOR) 投标人会议 采购谈判 检查 审计 索赔管理 采购合同争议解决方式对
- Feign整合Sentinel 开启 feign.sentinel.enabled=true 启动报错
- php yii 微信支付宝,Yii使用easywechat实现微信支付
- 昨天与友人聊的二三观点
热门文章
- Flex中如何通过设置GridLines对象的horizontalAlternateFill样式交错显示LineSeries图表背景颜色的例子...
- 求二叉树中某结点的父结点(左右孩子表示法)
- vs2010下libevent的使用
- extern作用详解
- zend studio 8使用感受
- Yii 2.0 权威指南 (6) 请求处理
- DBeaver连接SqlServer报“The server selected protocol version TLS10 is not accepted by client prefere”的错误
- C#读取所有PC中所有进程
- JS常用函数(方法)
- 用python画明星_Python也能成为毕加索?我用Python给小姐姐画了幅油画