mybloger

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

65、搜索旋转排序数组

整数数组 nums 按升序排列,数组中的值 互不相同

在传递给函数之前,nums 在预先未知的某个下标 k0 <= 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、寻找两个正序数组的中位数

给定两个大小分别为 mn 的正序(从小到大)数组 nums1nums2。请你找出并返回这两个正序数组的 中位数

算法的时间复杂度应该为 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);
        }
    }
}
posted on 2025-08-01 21:32  万能包哥  阅读(10)  评论(0)    收藏  举报