diff --git a/Algorithms/0153. Find Minimum in Rotated Sorted Array/153. Find Minimum in Rotated Sorted Array.go b/Algorithms/0153. Find Minimum in Rotated Sorted Array/153. Find Minimum in Rotated Sorted Array.go new file mode 100644 index 00000000..0c8622d8 --- /dev/null +++ b/Algorithms/0153. Find Minimum in Rotated Sorted Array/153. Find Minimum in Rotated Sorted Array.go @@ -0,0 +1,65 @@ +package leetcode + +// 解法一 二分 +func findMin(nums []int) int { + low, high := 0, len(nums)-1 + for low < high { + if nums[low] < nums[high] { + return nums[low] + } + mid := low + (high-low)>>1 + if nums[mid] >= nums[low] { + low = mid + 1 + } else { + high = mid + } + } + return nums[low] +} + +// 解法二 二分 +func findMin1(nums []int) int { + if len(nums) == 0 { + return 0 + } + if len(nums) == 1 { + return nums[0] + } + if nums[len(nums)-1] > nums[0] { + return nums[0] + } + low, high := 0, len(nums)-1 + for low <= high { + mid := low + (high-low)>>1 + if nums[low] < nums[high] { + return nums[low] + } + if (mid == len(nums)-1 && nums[mid-1] > nums[mid]) || (mid < len(nums)-1 && mid > 0 && nums[mid-1] > nums[mid] && nums[mid] < nums[mid+1]) { + return nums[mid] + } + if nums[mid] > nums[low] && nums[low] > nums[high] { // mid 在数值大的一部分区间里 + low = mid + 1 + } else if nums[mid] < nums[low] && nums[low] > nums[high] { // mid 在数值小的一部分区间里 + high = mid - 1 + } else { + if nums[low] == nums[mid] { + low++ + } + if nums[high] == nums[mid] { + high-- + } + } + } + return -1 +} + +// 解法三 暴力 +func findMin2(nums []int) int { + min := nums[0] + for _, num := range nums[1:] { + if min > num { + min = num + } + } + return min +} diff --git a/Algorithms/0153. Find Minimum in Rotated Sorted Array/153. Find Minimum in Rotated Sorted Array_test.go b/Algorithms/0153. Find Minimum in Rotated Sorted Array/153. Find Minimum in Rotated Sorted Array_test.go new file mode 100644 index 00000000..43d3cde8 --- /dev/null +++ b/Algorithms/0153. Find Minimum in Rotated Sorted Array/153. Find Minimum in Rotated Sorted Array_test.go @@ -0,0 +1,77 @@ +package leetcode + +import ( + "fmt" + "testing" +) + +type question153 struct { + para153 + ans153 +} + +// para 是参数 +// one 代表第一个参数 +type para153 struct { + nums []int +} + +// ans 是答案 +// one 代表第一个答案 +type ans153 struct { + one int +} + +func Test_Problem153(t *testing.T) { + + qs := []question153{ + + question153{ + para153{[]int{5, 1, 2, 3, 4}}, + ans153{1}, + }, + + question153{ + para153{[]int{1}}, + ans153{1}, + }, + + question153{ + para153{[]int{1, 2}}, + ans153{1}, + }, + + question153{ + para153{[]int{2, 1}}, + ans153{1}, + }, + + question153{ + para153{[]int{2, 3, 1}}, + ans153{1}, + }, + + question153{ + para153{[]int{1, 2, 3}}, + ans153{1}, + }, + + question153{ + para153{[]int{3, 4, 5, 1, 2}}, + ans153{1}, + }, + + question153{ + para153{[]int{4, 5, 6, 7, 0, 1, 2}}, + ans153{0}, + }, + } + + fmt.Printf("------------------------Leetcode Problem 153------------------------\n") + + for _, q := range qs { + _, p := q.ans153, q.para153 + fmt.Printf("【input】:%v 【output】:%v\n", p, findMin(p.nums)) + } + fmt.Printf("\n\n\n") +} diff --git a/Algorithms/0153. Find Minimum in Rotated Sorted Array/README.md b/Algorithms/0153. Find Minimum in Rotated Sorted Array/README.md new file mode 100755 index 00000000..17cf0ab9 --- /dev/null +++ b/Algorithms/0153. Find Minimum in Rotated Sorted Array/README.md @@ -0,0 +1,35 @@ +# [153. Find Minimum in Rotated Sorted Array](https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/) + + +## 题目: + +Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. + +(i.e., `[0,1,2,4,5,6,7]` might become `[4,5,6,7,0,1,2]`). + +Find the minimum element. + +You may assume no duplicate exists in the array. + +**Example 1:** + + Input: [3,4,5,1,2] + Output: 1 + +**Example 2:** + + Input: [4,5,6,7,0,1,2] + Output: 0 + + +## 题目大意 + +假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。 + +你可以假设数组中不存在重复元素。 + + +## 解题思路 + +- 给出一个原本从小到大排序过的数组,但是在某一个分割点上,把数组切分后的两部分对调位置,数值偏大的放到了数组的前部。求这个数组中最小的元素。 +- 求数组最小的元素其实就是找分割点,前一个数比当前数大,后一个数比当前数也要大。可以用二分搜索查找,需要查找的两个有序区间。时间复杂度 O(log n)。这一题也可以用暴力解法,从头开始遍历,动态维护一个最小值即可,时间复杂度 O(n)。