首页 > 其他分享 >153. Find Minimum in Rotated Sorted Array

153. Find Minimum in Rotated Sorted Array

时间:2024-02-07 21:31:56浏览次数:49  
标签:153 return nums Rotated mid len high Minimum low

题目

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 min 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)。

参考代码

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
}

标签:153,return,nums,Rotated,mid,len,high,Minimum,low
From: https://blog.51cto.com/u_16110811/9640608

相关文章

  • CF1535
    A:氵B:排序对两个偶数没影响,对两个奇数没影响。唯一的影响是可能原本偶数在后面,调到前面贡献变多。所以把所有偶数弄到前面就行。C:\(dp[i]\)表示前\(i\)个字符以第\(i\)个字符结尾,有多少个子串符合条件。若\(s[i]=?\),\(dp[i]=dp[i-1]+1\)。若\(s[i]=0,1\),分类:如果上一个......
  • abc297F - Minimum Bounding Box 2
    abc297F-MinimumBoundingBox2题意:n*m的网格,在上面随机选k个不重复的点,问能够包含这k个点的最小的矩形的面积的期望值。我们可以考虑每个点对和的贡献,直接算并不好算,我们可以考虑哪些矩形不会包含它,就是在四个方向上选k个点(比如在横坐标小于x的点中选k个),然后有四块区域的被......
  • P1536 村村通(并查集)
    村村通题目描述某市调查城镇交通状况,得到现有城镇道路统计表。表中列出了每条道路直接连通的城镇。市政府"村村通工程"的目标是使全市任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要相互之间可达即可)。请你计算出最少还需要建设多少条道路?输入格式输入包含若干......
  • UL153台灯测试报告 
    携式照明电灯台灯手电筒UL153①⑧〇②⑥⑨①①⑥④③亚马逊对带电类产品的审核很是严格,而此番亚马逊大量发送上述邮件,更多的是为卖家们起到提示作用。“为保证消费者的安全,亚马逊始终强调带电的产品都需要有相关的认证方可进行销售。下面简单介绍一下亚马逊被投诉常见要做UL认证的......
  • 1.9 Rotated Multi-Scale Interaction Network for Referring Remote Sensing Image S
    RotatedMulti-ScaleInteractionNetworkforReferringRemoteSensingImageSegmentation参考遥感图像分割的旋转多尺度交互网络参考遥感图像分割(RRSIS)是一个新的挑战,它结合了计算机视觉和自然语言处理,通过文本查询描述了航空图像中的特定区域。传统的参考图像分割(RIS)......
  • CF1536F Omkar and Akmar 题解
    思路首先最后的局面在两两字母间一定不会多于\(1\)个空格。考虑反证,假设有两个空格,那么有以下两种情况:\(\text{A}\_\_\text{B}\),\(\text{A}\_\_\text{A}\),也就是两边的字母不同,相同。对于第一种,在任意一个空格都可以填一个与他相邻字符不同的字符,对于第二种,填\(\text{B}\)......
  • [Codeforces] CF1538F Interesting Function
    CF1538FInterestingFunction题目传送门题意给定两个正整数\(l,r\)(\(l<r\)),将\(l\)不断加\(1\)直到\(l=r\),求出这一过程中\(l\)发生变化的位数总数。位数变化指:\(l=909\),将\(l+1\)后有\(2\)位数字发生变化。\(l=9\),将\(l+1\)后也有\(2\)位数字发生变......
  • [Codeforces] CF1536C Diluc and Kaeya
    CF1536CDilucandKaeya题意题目传送门给你一个字符串\(S\),其中只包含'K'或'D'两种字符,要求划分这个字符串使得各部分的\(n(D):n(K)\)相同,其中\(n(D)\)表示\(S\)中字符'D'出现的个数,最大化划分后形成的组数。求出\(S\)的所有前缀中的上述答案。思路注意到,如......
  • [LeetCode] 1578. Minimum Time to Make Rope Colorful
    Alicehasnballoonsarrangedonarope.Youaregivena0-indexedstringcolorswherecolors[i]isthecoloroftheithballoon.Alicewantstheropetobecolorful.Shedoesnotwanttwoconsecutiveballoonstobeofthesamecolor,sosheasksBobfor......
  • CF1887C Minimum Array 题解
    Problem-1887C-CodeforcesMinimumArray-洛谷有点被降智了/ll首先区间修改显然先转化成差分序列单点修改。显然对于相同的操作序列,\(a_i\)的取值对答案无影响,因此我们可以先让\(a_i\)全部取\(0\),最后再加回来即可假如说操作到某一时刻,\(a_i\)的值中第一个......