mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-06 17:44:10 +08:00
添加 problem 153
This commit is contained in:
@ -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
|
||||||
|
}
|
@ -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")
|
||||||
|
}
|
35
Algorithms/0153. Find Minimum in Rotated Sorted Array/README.md
Executable file
35
Algorithms/0153. Find Minimum in Rotated Sorted Array/README.md
Executable file
@ -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)。
|
Reference in New Issue
Block a user