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

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

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


f428356dc0404344aea15836100b5c87.png

解法一

暴力

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;
        }
}


搜索旋转排序数组


e8b49cfeee2e47eb99cfb701a0a28065.png


解法一

二分

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;
    }
}


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


f7dcd3b8de1a4ebea97a2c0c9252d0cd.png

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;
    }
}
相关文章
【LeetCode】每日一题&&两数之和&&寻找正序数组的中位数&&找出字符串中第一个匹配项的下标&&在排序数组中查找元素的第一个和最后一个位置
【LeetCode】每日一题&&两数之和&&寻找正序数组的中位数&&找出字符串中第一个匹配项的下标&&在排序数组中查找元素的第一个和最后一个位置
|
4月前
|
算法
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
|
4月前
|
算法 索引
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
这篇文章介绍了LeetCode第34题"在排序数组中查找元素的第一个和最后一个位置"的解题方法,通过使用双指针法从数组两端向中间同时查找目标值,有效地找到了目标值的首次和最后一次出现的索引位置。
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
|
7月前
|
算法
leetcode-34:在排序数组中查找元素的第一个和最后一个位置
leetcode-34:在排序数组中查找元素的第一个和最后一个位置
35 0
|
算法
【算法专题突破】二分查找 - 在排序数组中查找元素的第一个和最后一个位置(17)
【算法专题突破】二分查找 - 在排序数组中查找元素的第一个和最后一个位置(17)
71 0
LeetCode-34 在排序数组中查找元素的第一个和最后一个位置
LeetCode-34 在排序数组中查找元素的第一个和最后一个位置
|
算法 C语言 C++
【二分查找】34. 在排序数组中查找元素的第一个和最后一个位置
二分查找是一种高效的查找算法,其时间复杂度为 O(log n)。在许多情况下,我们需要在一个有序数组中找到某个目标值的搜索范围。本文将介绍一种基于二分查找的搜索范围查找算法,该算法能够快速找到目标值在数组中的起始和结束位置。
79 0
|
算法
每日一题—— 在排序数组中查找元素的第一个和最后一个位置
每日一题—— 在排序数组中查找元素的第一个和最后一个位置
|
算法
力扣34题. 在排序数组中查找元素的第一个和最后一个位置
力扣34题. 在排序数组中查找元素的第一个和最后一个位置
87 0
|
算法
LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置
LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置
113 0
LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置