LeetCode刷题笔录 Median Of Two Sorted Arrays

计算机视觉-全景图像拼接中的特征匹配与优化策略 本文深入探讨了计算机视觉中全景图像拼接的核心技术,重点解析了特征匹配后的关键优化策略。通过SIFT特征提取、RANSAC算法剔除误匹配,并结合APAP算法应对视差与鬼影问,详细阐述了从基础对齐到无缝融合的完整流程,为开发者实现高质量全景拼接提供了实用指南。 阅读详情
  1. 先说临界情况

  2. A为空或者B为空
    直接在非空数组中找第k大的数即可。O(1)
  3. 找最小的数,k==0的情况,也简单,比较两个数组最开头的元素,谁小就是谁
  1. 然后就是比较复杂的情况,假设寻找目标target是下标为k的数。
    那么意味着在排好的数组中,在目标数之前,一共有k个比目标更小的数。
    将k分成两份,一份在A的前端,一份在B的前端。这里其实将k怎么分配是一个可以讨论的问题,但是平分k可以得到平均最快的效果。
    设k = ka + kb,(k是偶数简单,k是奇数的话,剩下那一个随便放在两个数组中哪一个中都可以)

    这里可以列出来我们想要的效果:
    k=1 —-> ka = 1, kb = 1
    k=2 —-> ka = 1, kb = 1
    k=3 —-> ka = 1, kb = 1. [+1,表示还有一个元素,可以随意分配在ka或者kb中,只要不越界]
    k=4 —-> ka = 2, kb = 2
    k=5 —-> ka = 2, kb = 2. [+1]
    已经可以看出来规律了,这个造成了下面代码中比较复杂的部分,这些细节消耗的时间不少啊。

    然后就是主要逻辑

  2. 如果A[ka-1] >= B[kb-1]
    说明在B前端的kb个数中,不可能出现我们要寻找的目标。
    为什么呢?
    假如A一共有m个数,B一共有n个数。
    那么target(下标是k)后面有且只有n + m – 1 – k个数;
    但是B[kb-1]在B中已经排在n – kb个数之前,加上A中的m – ka + 1(A[ka-a]),也就是说在排序后的整体数组中排在B[kb-1]之后的数,至少有n – kb + m – ka + 1 = n + m – k + 1个。
    由于n + m – k + 1 > n + m – k – 1,所以B前端kb个数都不可能是target。
    所以此时可以将问题转化为,在A[0,...,m-1]和B[kb,...,n-1]中,寻找下标为k – kb的数。
  3. 否则,A[ka-1] < B[kb-1]
    同上,可以剔除A前端的ka个数。

这样循环下去,就能以二分的速度找到目标。

这个问题不仅要找到第k大的数,当C是偶数的时候,还要找到第k+1个数,取两者均值。

public class MedianOfTwoSortedArrays {
	public double findMedianSortedArrays(int A[], int B[], int m, int n) {
        // Start typing your Java solution below
        // DO NOT write main() function
        
		int lowA =0;
		int lowB = 0;
		int highA = m - 1;
		int highB = n - 1;
		int k = (m + n) / 2;
		if((m + n) % 2 == 0){
			return (findKth(A, B, lowA, highA, lowB, highB, k) + findKth(A, B, lowA, highA, lowB, highB, k + 1)) / 2.0;
		}
		else
			return findKth(A, B, lowA, highA, lowB, highB, k);
    }
	
	public int findKth(int A[], int B[], int lowA, int highA, int lowB, int highB, int k){
		int m = highA - lowA + 1;
		int n = highB - lowB + 1;
		if (m == 0) 
			return B[lowB + k];
		if (n == 0)
			return A[lowA + k];
		if (k == 0 )
			return A[lowA] > B[lowB] ? B[lowB] : A[lowA];
		
		/*
		int midA = (lowA + highA) / 2;
		int midB = (lowB + highB) / 2;
		if(A[midA] > B[midB]){
			if((midA + midB + 1) >= k)
				return findKth(A, B, lowA, midA, lowB, highB, k);
			else
				return findKth(A, B, lowA, highA, midB + 1, highB, k - (n / 2 + 1));
		}
		else{
			if((midA + midB + 1) >= k)
				return findKth(A, B, lowA, highA, lowB, midB, k);
			else
				return findKth(A, B, midA + 1, highA, lowB, highB, k - (m / 2 + 1));
		}
		*/
			// Reduce search ranges in A and B
		int midA = m * k / (m + n);
		int midB = k - midA - 1;
		 // Add offset so that imid_A and imid_B index directly into A and B,  respectively 
		midA += lowA;
		midB += lowB;
		if (A[midA] > B[midB]) {
			k -= midB - lowB + 1;
			highA = midA;
			lowB = midB + 1;
		}
		else {
			k -= midA - lowA + 1;
			lowA = midA + 1;
			highB = midB;
		}
		return findKth(A, B, lowA, highA, lowB, highB, k);
	}
	
	
}


揭秘N531:这颗不到2毛钱的国产栅极驱动器,如何成为功率开关的“全能搭档”? 本文深入解析了国产栅极驱动器N531如何成为功率开关的“全能搭档”。针对MOSFET和IGBT等电压驱动器件在实际应用中需要大电流实现快速开关的核心痛点,N531凭借±500mA的强劲驱动能力、宽电压供电及高兼容性,有效降低开关损耗,提升系统效率与可靠性。文章通过实战案例与设计指南,阐述了这颗高性价比芯片在简化设计、降低成本方面的显著优势。 阅读详情

相关推荐

STM32CubeMx + FatFs 实战:SD卡DMA传输中断回调问深度解析

本文深度解析了在STM32CubeMx环境下,结合FatFs文件系统并使用DMA进行SD卡读写时,程序可能出现的“卡死”问。核心原因在于HAL库的弱函数回调机制未被正确处理,导致DMA传输完成中断后,状态机锁死。文章提供了两种实战修复方案:直接修改HAL库文件或在用户代码中重写回调函数,并给出了关键的配置检查点与调试技巧,帮助开发者彻底解决SD卡DMA传输中断回调失效的难

weixin_29176179的博客 306

两个有序表的中位数

算法思想 假设上述图片的两行数字分别数组A和数组B,在这只里只需找到一条这样的分界线=>将这两个数组分成两部分(如果两数组之和为奇数,就让左半部分闭右半部分多一个数),使得左半部分中的每一个数都小于右半部分中的每一个数.此时如果两数组之和为奇数的话,左半部分的最大值就是中位数,如果两数组之和为偶数的话,那么左半部分的最大值和右半部分的最大值的平均数就是中位数.左右部分元素个数的确定:假设数组A的元素个数为m,数组B的元素个数为n,如果m+n为偶数的话,左半部分的元素个数为(m+n)/2,如果m+n为奇数的

2503_91190672的博客 697

倍福CX9020(WINCE 7)控制器使用方法和操作

CX9020系列是倍福控制器中较为经济的,操作系统为Windows Embedded Compact 7(简称WINCE7或WINEC7),相对高端控制器(WINES7以上系统),操作系统古老而简洁,上位机软件的编写困难很多,本文是笔者在使用过程中摸索的流程,旨在为CX9020系列的新用户提供参考,也可供其他CE系统的控制器参考。本文中大部分截图采用倍福中国的培训文档,这是由于笔者是在流程走通后再写这篇文章,不想再恢复出厂设置走一遍截图。因笔者在写这篇文章时使用倍福控制器经验并不丰富,难免有纰漏,请读者批评

weixin_41883890的博客 4258

排序算法一览(c语言实现)

前言 本文主要介绍四大排序思想,详情看旁栏目录。 先附上用于检验的主函数以及相关准备工作。 #include <stdio.h> #include <stdlib.h> #define LeftChild(i) (2*(i)+1) #define cutoff (3) void print(int arr[],int N) { for(int i=0; i<N; i++) { printf("%d ",arr[i]); } printf("\n"); } void

julia_xueli的博客 1500

0411-两个排序数组的中位数

/** * Median of Two Sorted Arrays * 两个排序数组的中位数 */ #include <stdio.h> // Classical binary search algorithm, but slightly different // if cannot find the key, return the position where can ins...

jinjin-blog 198

寻找两个不等长数组的中位数 Median of Two Sorted Arrays

目源自于Leetcode。经典好目: 给出两个有序数组,长度不一定相同,一个是m一个是n,要求给出他们合并在一起之后的数组的中位数。 要求时间复杂度为O(log(m+n)),所以不可以合并数组再找中位数,否则复杂度就是O(m+n)。 数组的中位数 如果有序数组有奇数个元素,那么中位数是最中间那个元素。 如果有序数组有偶数个元素,那么中位数是中间两个元素的平均数。

LUCKYOJ 5126

俩个相同大小升序序列合并在一起的中位数解法

这道貌似还是一道考研,但是很久了 好像是2011年的。大概意思就是一个如果一个序列S1(1113,15,17,19)则中位数是15, S2=(2,4,6,8,20) ,如果把S1和S2按照升序合在一起则11是中位数。 让你写算法: 当然最常见的无非就是把他俩放在一个数组里然后直接就找到中间那个了,但是这样的算法复杂度就会变成O(N),有没有更好的办法呢,当然首先就要利用中位数的性质。 假设...

qq_44063802的博客 515

Median of Two Sorted Arrays

public class Solution { public double findMedianSortedArrays(int A[], int B[]) { int sumOfLen = A.length + B.length; return sumOfLen % 2 == 1 ? recFindK(A, B, 0, A.length

baidu_17223201的专栏 315

算法导论9.3-8-设X[1..n]和Y[1..n]为两个数组,每个都包含n个已排好序的数,给出一个求数组X和数组Y中所有2n个元素的中位数

#include #include #include #include using namespace boost::timer; using namespace std; int partition(int *a,int low,int high) { int key=a[high]; int p=low-1; int tmp; for(int i=low;i<high;++i

shakingWaves的专栏 4807

LeetCode //C - 1223. Dice Roll Simulation

Summary: This problem involves counting the number of distinct sequences possible when rolling a die n times, with constraints on the maximum consecutive occurrences of each number. The solution uses dynamic programming to track sequences ending with each

Made in Code 209

LeetCode 198:打家劫舍

动态规划解打家劫舍,核心在于定义 dp[i] 为前 i+1 间房能偷的最大金额。状态转移:dp[i]=max(dp[i-1], dp[i-2]+nums[i]),即当前房不偷或偷取(加上前 i-1 间最优)。初版误以为奇偶位置二选一,被反例 [2,1,1,2] 推翻,正解为 2+2=4。关键在于明确状态与选择,而非机械套公式。

find1star的博客 143

LeetCode 32. 最长有效括号

的关键是先把“括号是否匹配”和“有效子串是否连续”拆开。当前 ')' 只能匹配最近的、尚未匹配的 '('isValid被标记的位置连续多少个,最长有效括号子串就是多少。这份写法虽然不是最省空间的栈写法,但思路清晰:先标记所有有效位置,再统计最长连续有效区间。

zander258的博客 198

LeetCode 350. 两个数组的交集 II|Python 解法详解

这道的关键是:统计较短数组的元素频次,再扫描另一个数组。理解这一点后,再结合边界条件检查,代码就能保持清晰且稳定。

a1250467048的博客 177

解决leetcode第4017数组中的峰值II

本文解决“数组中的峰值II”难:统计区间内峰值子数组数量并支持单点更新。方法将区间按峰值索引分段,利用左右扩展计数,使用分治组合避免重复,并设计了峰值索引获取、分段统计、更新数组等函数。最终通过预处理查询顺序输出答案,示例验证正确。

2302_79682652的博客 195

LeetCode 19:删除链表的倒数第 N 个节点复盘| dummy + 快慢指针

<think>我们要求根据给定内容生成≤150字的文章摘要。内容较长,是关于删除链表倒数第N个节点的解思路。需要概括核心要点:dummy节点、快慢指针、fast先走n+1步、返回dummy.next、时间复杂度等。注意字数限制,中文摘要≤150字。要精简。 可能摘要:本文通过删除链表倒数第N个节点,讲解dummy+双指针方法。关键点:使用虚拟头节点处理删除头节点;slowPre需指向待删节点前一位,因此fast先走n+1步;再同步移动,当fast为空时,slowPre恰好在前一位,执行删除。最

yc2284238579的博客 193

20,84:有效的括号,柱状图中最大的矩形

这道目又是一道有严格先后顺序的数据结构,所以我们可以使用栈来轻松解决这类问。可以将字符串中处于左半部分的元素压入栈中,当遇到右半部分的元素时,我们可以将原来的元素先出栈,在和右半部分的元素进行比对,如果他俩是一对的话,就进行下一个循环,如果不是一对的话,就直接返回false,因为已经违反了规则。

2401_88017330的博客 189

leetcode 3903. 最小稳定下标 I 简单

如果不存在这样的下标,则返回。在下标 0 处,不稳定值为。

2401_88085478的博客 204

LeetCode 92:反转链表 II 复盘|从区间反转到头插法,彻底理解 dummy、pre、cur 和循环次数

<think>我们只需要根据用户提供的内容生成摘要,≤150字。用户内容是关于LeetCode反转链表II的详细讲解,包含头插法、指针、循环次数等。摘要需要简洁概括核心。注意字数限制。可以围绕目、头插法、核心步骤、复杂度。写一段话。需要≤150字。检查。</think>摘要:本要求反转单链表指定区间。推荐头插法:用dummy统一处理left=1,pre定位至left前一个,cur指向left。每次将cur.next摘出插到pre后,执行right-left次。核心三句“摘、接、插

yc2284238579的博客 322

LeetCode 补拙笔记 日期:2026.09.03 目:240.搜索二维矩阵 II

核心:最大距离等于首尾临界点位置差;最小距离是相邻临界点的位置差的最小值;优化亮点:不保存全部临界点,仅记录第一个、上一个临界点,省去集合开销;合并判断条件,减少if分支;关键点:链表头、尾节点不可能成为临界点,遍历条件要保证curr存在后继节点。

sheeta1998的博客 239

leetcode】(三)堆排序和桶排序

1,堆结构就是用数组实现的完全二叉树结构2,完全二叉树中如果每棵子树的最大值都在顶部就是大根堆3,完全二叉树中如果每棵子树的最小值都在顶部就是小根堆4,堆结构的heapInsert与heapify操作5,堆结构的增大和减少6,优先级队列结构,就是堆结构。

C__learner_的博客 191

LeetCode 338. 比特位计数(动态规划 + 位运算详解)

<think>我们根据要求,需要基于用户提供的文章内容,生成≤150字的文章摘要。用户文章是关于LeetCode 338的解思路,重点在动态规划和位运算。摘要需简洁概括核心内容。注意长度限制。</think>本文介绍 LeetCode 338 “比特位计数”,采用动态规划与位运算计算 0 到 n 每个数的二进制中 1 的个数。核心递推公式为 ans[i] = ans[i >> 1] + (i & 1),时间复杂度 O(n),空间复杂度 O(n)。同时对比了暴力法、Brian Kernighan 算法等

2603_95532426的博客 325

LeetCode:滑动窗口破解最小子数组

解法⼀:暴力求解(会超时)算法思路:「从前往后」枚举数组中的任意⼀个元素,把它当成起始位置。然后从这个「起始位置」开始,然后寻找⼀段最短的区间,使得这段区间的和「⼤于等于」⽬标值。将所有元素作为起始位置所得的结果中,找到「最⼩值」即可。

2502_93625125的博客 219

基于IDM和MOBIL算法的高速公路跟车与变道决策规划源码

该项目为基于IDM和MOBIL算法的高速公路跟车与变道决策规划源码,采用Matlab语言编写,共计包含22个文件,其中包含9个MAT文件、4个M文件、2个MD文件、2个SLXC文件、2个SLX文件、2个XML文件、1个ASV文件。该源码旨在实现高速公路上的智能跟车和变道决策,适用于高速公路交通管理系统的研究与开发。

ISO 5817-2023 中文版.rar

ISO 5817-2023 中文版.rar

上一篇: LeetCode刷题笔录 Two Sum
下一篇: LeetCode刷题笔录 Longest Substring Without Repeating Characters
likecool21
博客等级 码龄14年 14粉丝 123原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值