1 #include "000库函数.h"
2
3 //自解 68ms 弱爆了
4 //先找到最大值,然后确定目标值在最大值的左边还是右边
5 //最后使用折中寻找法,找到目标值的位置,此方法应该满足复杂度不超过logn的要求
6 class Solution {
7 public:
8 int search(vector<int>& 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<int>& 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<int>& 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<int>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 }