网站知识架构在线培训系统软件
web/
2025/10/1 6:12:25/
文章来源:
网站知识架构,在线培训系统软件,赛尔网络公司好不好,成都网站建设创意一.题目要求
已知一个长度为 n 的数组#xff0c;预先按照升序排列#xff0c;经由 1 到 n 次 旋转 后#xff0c;得到输入数组。例如#xff0c;原数组 nums [0,1,2,4,5,6,7] 在变化后可能得到#xff1a;
若旋转 4 次#xff0c;则可以得到 [4,5,6,7,0,1,2]若旋转 7…一.题目要求
已知一个长度为 n 的数组预先按照升序排列经由 1 到 n 次 旋转 后得到输入数组。例如原数组 nums [0,1,2,4,5,6,7] 在变化后可能得到
若旋转 4 次则可以得到 [4,5,6,7,0,1,2]若旋转 7 次则可以得到 [0,1,2,4,5,6,7]
注意数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]] 。
给你一个元素值 互不相同 的数组 nums 它原来是一个升序排列的数组并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。 你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。
二.题目难度
中等
三.输入样例
示例 1 输入nums [3,4,5,1,2] 输出1 解释原数组为 [1,2,3,4,5] 旋转 3 次得到输入数组。
示例 2 输入nums [4,5,6,7,0,1,2] 输出0 解释原数组为 [0,1,2,4,5,6,7] 旋转 3 次得到输入数组。
示例 3 输入nums [11,13,15,17] 输出11 解释原数组为 [11,13,15,17] 旋转 4 次得到输入数组。
提示 n nums.length 1 n 5000 -5000 nums[i] 5000 nums 中的所有整数 互不相同 nums 原来是一个升序排序的数组并进行了 1 至 n 次旋转
四.解题思路
解法1延续 33. 搜索旋转排序数组二分的思路找到边界点其后的第一个元素就是最小值。 时间复杂度 O ( l o g n ) O(log\,n) O(logn)空间复杂度 O ( n ) O(n) O(n)
解法2 时间复杂度 O ( l o g n ) O(log\,n) O(logn)空间复杂度 O ( 1 ) O(1) O(1)
五.代码实现
解1
class Solution {
public:int findMin(vectorint nums) {int index dfs(nums, 0, nums.size() - 1);return nums[index 1];}int dfs(vectorint nums, int left, int right) {if (left right || (left right) / 2 1 nums.size())return -1;if (nums[(left right) / 2] nums[(left right) / 2 1])return (left right) / 2;int a dfs(nums, left, (left right) / 2 - 1);int b dfs(nums, (left right) / 2 1, right);if (a ! -1)return a;if (b ! -1)return b;return -1;}
};解2
class Solution {
public:int findMin(vectorint nums) {int l 0;int r nums.size() - 1;while (l r) {int m (l r) / 2;if (nums[m] nums[r]) {r m;} elsel m 1;}return nums[l];}
};六.题目总结
–
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/84887.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!