前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每日三题-寻找两个正序数组的中位数 、搜索旋转排序数组、 在排序数组中查找元素的第一个和最后一个位置

每日三题-寻找两个正序数组的中位数 、搜索旋转排序数组、 在排序数组中查找元素的第一个和最后一个位置

作者头像
才疏学浅的木子
发布2022-11-22 10:38:59
1.3K0
发布2022-11-22 10:38:59
举报
文章被收录于专栏:CSDN文章

👨‍💻个人主页: 才疏学浅的木子 🙇‍♂️ 本人也在学习阶段如若发现问题,请告知非常感谢 🙇‍♂️ 📒 本文来自专栏: 算法 🌈 算法类型Hot100题 🌈

每日三题

寻找两个正序数组的中位数

解法一

暴力

代码语言:javascript
复制
class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int m = nums1.length;
        int n = nums2.length;
        
        int left = -1;
        int right = -1;

        int start1 = 0;
        int start2 = 0;

        for(int i = 0;i <= (m+n)/2;i++){
            left = right;
            if(start1 < m && (start2 >= n || nums1[start1] < nums2[start2])){
                right = nums1[start1++];
            }else{
                right = nums2[start2++];
            }
        }
      
        if((m+n) % 2 == 0)return ((double)left+right)/2;
        else return right;
        }
}

搜索旋转排序数组

解法一

二分

代码语言:javascript
复制
class Solution {
    public int search(int[] nums, int target) {
        int n = nums.length;

        int left = 0,right = n-1;

        //数组 [a1,a2...an,b1,b2...bn] 其中b1~bn小于a1
        while(left <= right){
            int mid = (left+right)/2;
            if(nums[mid] == target) return mid;

            if(nums[mid] >= nums[0]){ //说明mid在[a1,a2...an]区间
                if(target > nums[mid]){ //说明target在[mid,...an区间]
                    left = mid+1;
                }else if(target < nums[mid]){ //说明target在[a1,...mid]区间 或者在[b1,b2..bn]区间
                    if(target >= nums[0]){ //说明在[a1...mid]区间
                        right = mid -1;
                    }else{
                        left = mid + 1;
                    }
                }
            }else{ //说明mid在[b1,b2...bn]区间
                if(target < nums[mid]){// 说明target在[b1,b2...mid]
                    right = mid -1;
                }else{ //说明target在[mid...bn] 或者[a1...an]区间
                    if(target > nums[n-1]){ //说明target在[a1..an]区间
                        right = mid -1;
                    }else{ //说明在[mid...bn]区间
                        left = mid + 1;
                    }
                }
            }
        }
        return -1;
    }
}

在排序数组中查找元素的第一个和最后一个位置

代码语言:javascript
复制
class Solution {
    public int[] searchRange(int[] nums, int target) {
        if(nums.length == 0) return new int[]{-1,-1};
        int left = lowBinarySearch(nums,target);
        int right = upBinarySearch(nums,target);
        return new int[]{left,right};
    }
    public int lowBinarySearch(int[] nums,int target){
        int left = 0;
        int right = nums.length-1;
        while(left < right){
            int mid = left + right >> 1;
            if(nums[mid] >= target) right = mid;
            else left = mid + 1;
        }
        return nums[left]==target?left:-1;
    }
    public int upBinarySearch(int[] nums,int target){
        int left = 0;
        int right = nums.length-1;
        while(left < right){
            int mid = left + right +1>> 1;
            if(nums[mid] <= target) left = mid;
            else right = mid-1;
        }
        return nums[left]==target?left:-1;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 每日三题
  • 寻找两个正序数组的中位数
  • 搜索旋转排序数组
  • 在排序数组中查找元素的第一个和最后一个位置
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档