介绍

假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [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之搜索旋转排序数组相关推荐

  1. LeetCode.M33.搜索旋转排序数组

    LeetCode.M33 题目: 题目大意: ​ 将一个严格升序且没有重复元素的数组的后半部分(从k处开始)移动到前半部分,进过这个操作变成一个新的数组,然后在这个一个新的数组中查找某个元素targe ...

  2. LeetCode—33. 搜索旋转排序数组

    33. 搜索旋转排序数组 题目描述:整数数组 nums 按升序排列,数组中的值 互不相同 . 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length ...

  3. 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, ...

  4. leetcode —— 33. 搜索旋转排序数组

    假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目标值, ...

  5. leetcode 33 搜索旋转排序数组 到处是细节的好题

    这个题想了想就会做,只是细节真的能卡死人,找了好久的bug.甚至我怀疑我现在的代码可能还有错,只是没例子测出来. 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2, ...

  6. LeetCode 33. 搜索旋转排序数组(二分查找)

    1. 题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在 ...

  7. LeetCode 81 搜索旋转排序数组 II

    题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转.( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ).编写一个函数来判断给定的目标值是否存在于数 ...

  8. 59. Leetcode 81. 搜索旋转排序数组 II(二分查找-局部有序)

    已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同.在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 ,使 ...

  9. Leetcode 33.搜索旋转排序数组 (每日一题 20210707)

    整数数组 nums 按升序排列,数组中的值 互不相同 .在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [num ...

  10. leetcode 81. 搜索旋转排序数组 II(二分查找)

    已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 , ...

最新文章

  1. 开发自己的山寨Android注解框架
  2. mp4文件时长 c++源码_【C语言】如何使用头文件 .h 编译 C 源码!so easy!
  3. PolarFS :一个用于共享存储云数据库的超低延迟和容错分布式文件系统
  4. idea怎么直接拉去git_如何将GitHub上面的项目拉取到IDEA中
  5. 获取select被选中的option的值
  6. tcp的发送端一个小包就能打破对端的delay_ack么?
  7. java中自定义异常的_java中的自定义异常(标准)
  8. [转载] java中关于用\t格式输出
  9. 查看你某条sql是哪个用户执行的_django_debug_toolbar:查看访问某个页面执行sql的详细...
  10. c语言指针的地址存放,c语言 - *指针 和 地址
  11. 电脑端用起来特别爽的四款软件,哪一款才是你的最爱?
  12. HDU1813:Escape from Tetris(IDA)
  13. 产品研发过程管理专题——产品需求分析原则一
  14. Tomcat启动Maven项目异常:java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext
  15. Oracle数据库索引原理分析
  16. Java多线程:同步集合与同步锁
  17. 第十二章 采购管理 采购合同类型以及其区别 合同类型与风险分担 自制与外购分析 招标文件 工作说明书(SOW) 工作大纲 (TOR) 投标人会议 采购谈判 检查 审计 索赔管理 采购合同争议解决方式对
  18. Feign整合Sentinel 开启 feign.sentinel.enabled=true 启动报错
  19. php yii 微信支付宝,Yii使用easywechat实现微信支付
  20. 昨天与友人聊的二三观点

热门文章

  1. Flex中如何通过设置GridLines对象的horizontalAlternateFill样式交错显示LineSeries图表背景颜色的例子...
  2. 求二叉树中某结点的父结点(左右孩子表示法)
  3. vs2010下libevent的使用
  4. extern作用详解
  5. zend studio 8使用感受
  6. Yii 2.0 权威指南 (6) 请求处理
  7. DBeaver连接SqlServer报“The server selected protocol version TLS10 is not accepted by client prefere”的错误
  8. C#读取所有PC中所有进程
  9. JS常用函数(方法)
  10. 用python画明星_Python也能成为毕加索?我用Python给小姐姐画了幅油画