LeetCode //C - 153. Find Minimum in Rotated Sorted Array

153. Find Minimum in Rotated Sorted Array

Suppose an array of length n sorted in ascending order is rotated between 1 and n times. For example, the array nums = 0,1,2,4,5,6,7 might become:

  • 4,5,6,7,0,1,2 if it was rotated 4 times.
  • 0,1,2,4,5,6,7 if it was rotated 7 times.

Notice that rotating an array a\[0, a1, a2, ..., an-1] 1 time results in the array a\[n-1, a0, a1, a2, ..., an-2].

Given the sorted rotated array nums of unique elements, return the minimum element of this array.

You must write an algorithm that runs in O(log n) time.

Example 1:

Input: nums = 3,4,5,1,2
Output: 1
Explanation: The original array was 1,2,3,4,5 rotated 3 times.

Example 2:

Input: nums = 4,5,6,7,0,1,2
Output: 0
Explanation: The original array was 0,1,2,4,5,6,7 and it was rotated 4 times.

Example 3:

Input: nums = 11,13,15,17
Output: 11
Explanation: The original array was 11,13,15,17 and it was rotated 4 times.

Constraints:
  • n == nums.length
  • 1 <= n <= 5000
  • -5000 <= numsi <= 5000
  • All the integers of nums are unique.
  • nums is sorted and rotated between 1 and n times.

From: LeetCode

Link: 153. Find Minimum in Rotated Sorted Array


Solution:

Ideas:

1. Binary Search:

The array is sorted but rotated. If we pick the middle element, we can determine which half of the array is strictly increasing and which half contains the rotation point (and hence the minimum).

2. Identifying the Correct Half:

  • If the middle element is greater than the rightmost element, the rotation point (and minimum) must be to the right of the middle. For example, in 4, 5, 6, 7, 0, 1, 2, picking the middle element 7 shows that the array is not strictly increasing from mid to right, so we search in the right half.
  • If the middle element is less than or equal to the rightmost element, the rotation point is in the left half (including the middle element). For example, in 5, 6, 7, 0, 1, 2, 4, picking the middle element 0 shows that the array is strictly increasing from mid to right, so we search in the left half.

3. Finding the Minimum:

Continue the binary search until the left and right pointers converge, at which point they will point to the minimum element in the array.

4. Time Complexity:

The binary search cuts the search space in half at each step, resulting in an O(logn) time complexity, where n is the size of the array.

5. Implementation:

  • Initialize two pointers, left and right, to the start and end of the array, respectively.
  • Repeat the following until left < right:
    • Calculate the middle index.
    • If the middle element is greater than the rightmost element, update left to mid + 1.
    • Otherwise, update right to mid.
  • When left == right, the pointers have converged to the minimum element. Return numsleft.
Code:
c 复制代码
int findMin(int* nums, int numsSize) {
    int left = 0, right = numsSize - 1;
    
    while (left < right) {
        int mid = left + (right - left) / 2;
        
        if (nums[mid] > nums[right]) {
            // If mid element is greater than the rightmost element,
            // the minimum must be in the right part
            left = mid + 1;
        } else {
            // If mid element is less than or equal to the rightmost element,
            // the minimum must be in the left part including the mid element
            right = mid;
        }
    }
    
    // When the while loop ends, left == right, pointing to the minimum element
    return nums[left];
}
相关推荐
小雉系统19 小时前
BcoreOS安全通信架构:FsSession 抗算法后门安全设计
算法·安全·架构
§ꦿCFོ༉20 小时前
嵌入式八股文—C语言入门学习(四)
c语言·开发语言·学习
唐墨1231 天前
linux kernel 比较数据大小的宏定义
linux·算法
拂拉氏1 天前
【知识讲解-题目讲解】 统计满足K约束的子字符串数量2 (滑动窗口+前缀和+二分查找+分析)
算法·前缀和·二分查找·滑动窗口
通信小呆呆1 天前
电子战抗干扰技术:当“不被干扰”成为一种系统
算法·通信·mimo·isac
笑容掩饰我的失落1 天前
区块链从小白到精通(八):从零实现一个标准 ERC-20 代币(完整可运行代码)
算法·区块链·php·智能合约·哈希算法
Severus_black1 天前
【C++初阶】Stack、Queue算法题大练兵!
c语言·c++·算法·stl
唐青枫1 天前
C 语言 strcpy() 用法详解与实战 Demo
c语言
2601_967979121 天前
机器学习必修课:经典算法与Python实战
python·算法·机器学习·实战·课程