65、搜索旋转排序数组
整数数组 nums 按升序排列,数组中的值 互不相同 。
在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。
给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。
你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。
class Solution {
public int search(int[] nums, int target) {
int l = 0,r = nums.length - 1;
while (l <= r) {
int mid = l + (r - l) / 2;
if (nums[mid] == target)
return mid;
// 左边是否是有序的
if (nums[mid] >= nums[l]) {
// 是否在左边有序序列中
if (nums[mid] > target && target >= nums[l]) {
r = mid - 1;
}else {
l = mid + 1;
}
}else {
// 是否在右边有序序列中
if (nums[mid] < target && target <= nums[r]) {
l = mid + 1;
}else {
r = mid - 1;
}
}
}
return -1;
}
}
66、寻找两个正序数组的中位数
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int len1 = nums1.length;
int len2 = nums2.length;
// 创建一个可变的列表用于存放合并后的数组
ArrayList<Integer> ans = new ArrayList<>();
// 将 nums1 和 nums2 中的元素逐一添加到 ans 列表
for (int num : nums1) {
ans.add(num);
}
for (int num : nums2) {
ans.add(num);
}
// 对合并后的列表进行排序
Collections.sort(ans);
int totalLength = len1 + len2;
// 判断总长度是否为偶数
if (totalLength % 2 == 0) {
// 如果为偶数,返回中间两个数的平均值
return (ans.get(totalLength / 2) + ans.get(totalLength / 2 - 1)) / 2.0;
} else {
// 如果为奇数,返回中间的数
return ans.get(totalLength / 2);
}
}
}
|
作者:万能包哥 出处:http://www.cnblogs.com/mybloger/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 如果文中有什么错误,欢迎指出。以免更多的人被误导。 |
浙公网安备 33010602011771号