@@ -266,27 +266,33 @@ int findMin(vector<int>& nums) {
266266> 请找出其中最小的元素。(包含重复元素)
267267
268268```c++
269- int findMin(vector<int> &nums) {
270- if (nums.empty()) {
271- return -1;
269+ func findMin(nums []int) int {
270+ // 思路:跳过重复元素,mid值和end值比较,分为两种情况进行处理
271+ if len(nums) == 0 {
272+ return -1
272273 }
273- auto left = 0;
274- auto right = nums.size() - 1;
275- while (left + 1 < right) {
276- while (left < right && nums[right] == nums[right - 1]) {
277- --right;
274+ start := 0
275+ end := len(nums) - 1
276+ for start+1 < end {
277+ // 去除重复元素
278+ for start < end && nums[end] == nums[end-1] {
279+ end--
278280 }
279- while (left < right && nums[left ] == nums[left + 1]) {
280- ++left;
281+ for start < end && nums[start ] == nums[start+1] {
282+ start++
281283 }
282- auto mid = left + (right - left) / 2;
283- if (nums[mid] <= nums[right]) {
284- right = mid;
284+ mid := start + (end-start)/2
285+ // 中间元素和最后一个元素比较(判断中间点落在左边上升区,还是右边上升区)
286+ if nums[mid] <= nums[end] {
287+ end = mid
285288 } else {
286- left = mid;
289+ start = mid
287290 }
288291 }
289- return (nums[left] >= nums[right]) ? nums[right] : nums[left];
292+ if nums[start] > nums[end] {
293+ return nums[end]
294+ }
295+ return nums[start]
290296}
291297```
292298
@@ -297,40 +303,41 @@ int findMin(vector<int> &nums) {
297303> 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
298304> 你可以假设数组中不存在重复的元素。
299305
300- ``` c++
301- int search (vector<int > &nums, int target) {
302- if (nums.empty()) {
303- return -1;
306+ ``` go
307+ func search (nums []int , target int ) int {
308+ // 思路:/ / 两条上升直线,四种情况判断
309+ if len (nums) == 0 {
310+ return -1
304311 }
305- auto left = 0;
306- auto right = nums.size() - 1;
307- while (left + 1 < right) {
308- auto mid = left + (right - left) / 2;
309- if (nums[ mid] == target) {
310- return mid;
312+ start := 0
313+ end := len (nums) - 1
314+ for start+1 < end {
315+ mid := start + (end-start)/2
316+ // 相等直接返回
317+ if nums[mid] == target {
318+ return mid
311319 }
312- if (nums[ left] < nums[ mid] ) {
313- if (nums[ left] <= target && target <= nums[ mid] ) {
314- right = mid;
320+ // 判断在那个区间,可能分为四种情况
321+ if nums[start] < nums[mid] {
322+ if nums[start] <= target && target <= nums[mid] {
323+ end = mid
315324 } else {
316- left = mid;
325+ start = mid
317326 }
318- } else if (nums[ mid] < nums[ right] ) {
319- // 这个判断是必须的!当只有两个数的时候,可能两个都不满足!
320- if (target >= nums[ mid] && nums[ right] >= target) {
321- right = mid;
327+ } else if nums[end] > nums[mid] {
328+ if nums[end] >= target && nums[mid] <= target {
329+ start = mid
322330 } else {
323- left = mid;
331+ end = mid
324332 }
325333 }
326334 }
327- if (nums[ left] == target) {
328- return left;
329- } else if (nums[ right] == target) {
330- return right;
331- } else {
332- return -1;
335+ if nums[start] == target {
336+ return start
337+ } else if nums[end] == target {
338+ return end
333339 }
340+ return -1
334341}
335342```
336343
@@ -344,39 +351,46 @@ int search(vector<int> &nums, int target) {
344351> ( 例如,数组 [ 0,0,1,2,2,5,6] 可能变为 [ 2,5,6,0,0,1,2] )。
345352> 编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。(包含重复元素)
346353
347- ```c++
348- bool search(vector<int>& nums, int target) {
349- if (nums.empty()) {
350- return false;
354+ ``` go
355+ func search (nums []int , target int ) bool {
356+ // 思路:/ / 两条上升直线,四种情况判断,并且处理重复数字
357+ if len (nums) == 0 {
358+ return false
351359 }
352- auto left = 0;
353- auto right = nums.size() - 1;
354- while (left + 1 < right) {
355- while (left < right && nums[left] == nums[left + 1]) {
356- ++left;
360+ start := 0
361+ end := len (nums) - 1
362+ for start+1 < end {
363+ // 处理重复数字
364+ for start < end && nums[start] == nums[start+1 ] {
365+ start++
357366 }
358- while (left < right && nums[right ] == nums[right - 1]) {
359- --right;
367+ for start < end && nums[end ] == nums[end- 1 ] {
368+ end--
360369 }
361- auto mid = left + (right - left) / 2;
362- if (nums[mid] == target) {
363- return true;
370+ mid := start + (end-start)/2
371+ // 相等直接返回
372+ if nums[mid] == target {
373+ return true
364374 }
365- if (nums[left] < nums[mid]) {
366- if (nums[left] <= target && target <= nums[mid]) {
367- right = mid;
375+ // 判断在那个区间,可能分为四种情况
376+ if nums[start] < nums[mid] {
377+ if nums[start] <= target && target <= nums[mid] {
378+ end = mid
368379 } else {
369- left = mid;
380+ start = mid
370381 }
371- } else if ( nums[mid] < nums[right]) {
372- if ( nums[mid] < = target && nums[right] > = target) {
373- left = mid;
382+ } else if nums[end] > nums[mid] {
383+ if nums[end] > = target && nums[mid] < = target {
384+ start = mid
374385 } else {
375- right = mid;
386+ end = mid
376387 }
377388 }
378389 }
379- return nums[left] == target || nums[right] == target;
390+ if nums[start] == target || nums[end] == target {
391+ return true
392+ }
393+ return false
380394}
381395```
382396
0 commit comments