博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
033搜索旋转排序数组
阅读量:6071 次
发布时间:2019-06-20

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

1 #include "000库函数.h"  2   3 //自解  68ms  弱爆了  4 //先找到最大值,然后确定目标值在最大值的左边还是右边  5 //最后使用折中寻找法,找到目标值的位置,此方法应该满足复杂度不超过logn的要求  6 class Solution {  7 public:  8     int search(vector
& nums, int target) { 9 if (nums.size() == 0)return -1; 10 11 int maxValue = *max_element(nums.begin(), nums.end());//最大值 12 int maxPosition = max_element(nums.begin(), nums.end()) - nums.begin();//最大值的位置 13 if (target > maxValue)return -1; 14 if (target == maxValue)return maxPosition; 15 int i, j, t; 16 if (target >= nums[0]) { 17 i = 0; 18 j = maxPosition; 19 } 20 else { 21 i = maxPosition+1; 22 j = nums.size() - 1; 23 } 24 while (i <= j) { 25 t = (i + j) / 2; 26 if (target == nums[t]) 27 return t; 28 else if (target > nums[t]) 29 i = t + 1; 30 else 31 j = t - 1; 32 } 33 return -1; 34 } 35 }; 36 37 //这道题的关键在与,找到哪一部分是升序的 38 //旋转数组有个特点,中间数的左右两边有一边一定是升序的,另一边就不一定了 39 //此种解法满足复杂度logn的要求 20ms 40 /* 41 42 0  1  2   4  5  6  7 43 44 7  0  1   2  4  5  6 45 46 6  7  0   1  2  4  5 47 48 5  6  7   0  1  2  4 49 50 4  5  6  7  0  1  2 51 52 2  4  5  6  7  0  1 53 54 1  2  4  5  6  7  0 55 56 57 */ 58 class Solution { 59 public: 60 int search(vector
& nums, int target) { 61 if (nums.size() == 0)return -1; 62 int i = 0, j = nums.size() - 1; 63 while (i <= j) { 64 int t = i + (j - i) / 2;//找到此时序列的中间位置 65 if (target == nums[t])return t; 66 if (nums[t] < nums[j]) { //此时右边为升序 67 if (nums[t] < target&&target <= nums[j])//目标函数位于右边 68 i = t + 1; 69 else 70 j = t - 1; 71 } 72 else { 73 if (nums[i] < target && nums[t]>target) 74 j = t - 1; 75 else 76 i = t + 1; 77 } 78 } 79 return -1; 80 } 81 }; 82 83 84 class Solution { 85 public: 86 int search(vector
& nums, int target) { 87 if (nums.size() == 0)return -1; 88 for (int i = 0; i < nums.size(); ++i) { 89 if (target == nums[i]) 90 return i; 91 } 92 return -1; 93 94 95 96 } 97 }; 98 99 void T033() {100 Solution s;101 vector
n;102 n = { 3,1 };103 cout << s.search(n, 1) << endl;104 n = { 4,5,6,7,0,1,2 };105 cout << s.search(n, 4) << endl;106 n = { 4,5,6,7,0,1,2 };107 cout << s.search(n, 7) << endl;108 n = { 4,5,6,7,0,1,2 };109 cout << s.search(n, 2) << endl;110 n = { 4,5,6,7,0,1,2 };111 cout << s.search(n, 0) << endl;112 113 }

 

转载于:https://www.cnblogs.com/zzw1024/p/10547165.html

你可能感兴趣的文章
Java基础学习总结——Java对象的序列化和反序列化
查看>>
Hadoop集群安装配置教程
查看>>
Android面试题目及其答案
查看>>
node上server与client通讯
查看>>
java源码分析 arraylist 增长机制
查看>>
PLSQL Developer使用技巧
查看>>
oracle库文件建立完整数据库的过程介绍
查看>>
使用系统相机拍照摄像
查看>>
万能字段使用技巧整理
查看>>
session使用
查看>>
Perl正则表达式
查看>>
我的友情链接
查看>>
java代码导入excel数据至oracle(poi方式)
查看>>
工作中常用的英文单词缩写
查看>>
我的友情链接
查看>>
获取颜色值转换为十六进制
查看>>
IP相关知识复习
查看>>
行业大佬集体唱衰教育O2O,强管控的B2C模式将是唯一出路
查看>>
Ubuntu的JSP服务器安装
查看>>
Centos 6.4 下设置静态IP,指定NAMESERVER(DNS),修改网卡MAC地址
查看>>