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

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

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


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;
    }
}
相关文章
|
5月前
|
算法
【LeetCode】每日一题&&两数之和&&寻找正序数组的中位数&&找出字符串中第一个匹配项的下标&&在排序数组中查找元素的第一个和最后一个位置
【LeetCode】每日一题&&两数之和&&寻找正序数组的中位数&&找出字符串中第一个匹配项的下标&&在排序数组中查找元素的第一个和最后一个位置
|
4月前
|
算法
leetcode-34:在排序数组中查找元素的第一个和最后一个位置
leetcode-34:在排序数组中查找元素的第一个和最后一个位置
18 0
|
5月前
|
算法 程序员 索引
【算法训练-二分查找 一】【基本二分】二分查找、在排序数组中查找元素的第一个和最后一个位置
【算法训练-二分查找 一】【基本二分】二分查找、在排序数组中查找元素的第一个和最后一个位置
31 0
|
7月前
|
算法
【算法专题突破】二分查找 - 在排序数组中查找元素的第一个和最后一个位置(17)
【算法专题突破】二分查找 - 在排序数组中查找元素的第一个和最后一个位置(17)
29 0
|
7月前
|
算法
【算法挨揍日记】day10——704. 二分查找、34. 在排序数组中查找元素的第一个和最后一个位置
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
332 0
|
9月前
|
算法
LeetCode-34 在排序数组中查找元素的第一个和最后一个位置
LeetCode-34 在排序数组中查找元素的第一个和最后一个位置
|
10月前
|
算法 C语言 C++
【二分查找】34. 在排序数组中查找元素的第一个和最后一个位置
二分查找是一种高效的查找算法,其时间复杂度为 O(log n)。在许多情况下,我们需要在一个有序数组中找到某个目标值的搜索范围。本文将介绍一种基于二分查找的搜索范围查找算法,该算法能够快速找到目标值在数组中的起始和结束位置。
48 0
|
11月前
|
算法
每日一题—— 在排序数组中查找元素的第一个和最后一个位置
每日一题—— 在排序数组中查找元素的第一个和最后一个位置
|
12月前
|
算法
力扣34题. 在排序数组中查找元素的第一个和最后一个位置
力扣34题. 在排序数组中查找元素的第一个和最后一个位置
67 0
每日一题:Leetcode34 在排序数组中查找元素的第一个和最后一个位置
每日一题:Leetcode34 在排序数组中查找元素的第一个和最后一个位置