Leetcode日练笔记12 #287 #4 Find the Duplicate Number (Medium) & Median of Two Sorted Array (Hard)

[Leetcode]287. Find the Duplicate Number简单解法及解释 双指针复杂度O(n) 题目链接:Find the Duplicate Number Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), prove that at least one duplicate number must exist. Assume that there 阅读详情

#287 Find the Duplicate Number

Given an array of integers nums containing n + 1 integers where each integer is in the range [1, n] inclusive.

There is only one repeated number in nums, return this repeated number.

You must solve the problem without modifying the array nums and uses only constant extra space.

解题思路:

用for循环看元素是否出现过,出现过输出,没出现过存在count里。

class Solution:
    def findDuplicate(self, nums: List[int]) -> int:
        count = {}
        for num in nums:
            if num in count:
                return num
            else:
                count[num] = 1
        return None

runtime:

556 smaple solution:

一样?好吧……

再想了一下有没有可能用二分搜索。因为sorted()是会建立一个新的list,不会改变到原有的nums。

就再sorted之后,看中值与头值的差是否等于中idx与头idx的差。如果相等,那么说明重复值在右边。反之则反。

然后这里是用到第三类的binary template。即筛选到最后剩两个值,就是重复的值。然后随意输出一个。

class Solution:
    def findDuplicate(self, nums: List[int]) -> int:
        n = sorted(nums)
        l, r = 0, len(n)-1
        while l+1 < r:
            m = (l+r)//2
            if n[m]-n[l] < m-l:
                r = m
            else:
                l = m 
        return n[l]

runtime: 

但sorted的过程,time complexity就是O(nlogn)了。不再是题目要求的linear,就是O(n)。同时也违反了题目的要求,虽然原list没变。但是涉及到了rearrange这步操作。所以也不行……

而且这个解法默认了题目给的list一定是consecutive的,虽然accepted了,但是那个二分搜索的依据就不成立了。

值得反复看官方solution的一道题。目前水平不够,等能轻松刷easy的题时,再琢磨研究medium的更多解法思路。(居然有龟兔赛跑的思路……

#287  Median of Two Sorted Arrays (Hard)

Given two sorted arrays nums1 and nums2 of size m and n respectively, return the median of the two sorted arrays.

The overall run time complexity should be O(log (m+n)).

解题思路:

本来这题不想做的……看到Hard就觉得自己现在应该做不了。

特别是限定条件是time complexity是O(log(m+n))。

不知道怎么能用二分搜索做出来。

硬着头皮先忽略这个限定条件看照自己的理解能不能解出来。

先merge两个list再sorted。然后看长度是单还是双,单就取中值,双就取中两值的平均数。

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        merged = sorted(nums1 + nums2)
        if len(merged) % 2:
            return merged[(len(merged)+1)//2-1]
        else:
            return (merged[len(merged)//2-1]+merged[len(merged)//2])/2

没想到runtime还行:

(ps 从这里开始我不确定这个runtime还是代表time complexity了……因为这个解法的time complexity应该是O(m+n)。

然后看64ms的solution:

比我idx的计算简洁(是我想复杂了),大体思路一样。 

还有一种72ms解法没看懂:

class Solution:
     def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
         a = [float("-inf")] + nums1 + [float("inf")]
         b = [float("-inf")] + nums2 + [float("inf")]
        
         if len(a) > len(b):
             a, b = b, a
        
         total = len(a) + len(b)
         half = total // 2
         l, r = 0, len(a) - 1
        
         while l <= r:
             i = (l + r) // 2
             j = half - i - 2 # avoid out of index error
            
             a_left, a_right = a[i], a[i+1]
             b_left, b_right = b[j], b[j+1]
            
             if a_left <= b_right and b_left <= a_right:
                 if total % 2 == 1: # odd
                     return min(a_right, b_right)
                 # even
                 return (max(a_left, b_left) + min(a_right, b_right)) / 2
            
             elif a_left > b_right:
                 r = i - 1
             else:
                 l = i + 1
       

看了一下discussion里推荐的视频:

https://www.youtube.com/watch?v=LPFhl65R7ww&t=1396shttps://www.youtube.com/watch?v=LPFhl65R7ww&t=1396s看完懂了。主要是切割了个list。然后把左右指针放在短list的头尾,找切割位置。

切割位置的判断标准是,短切左边最后一个值必须小于长切右边最小一个值,以及长切左边最后一个值小于短切右边最小一个值。这样才能保证切割完之后,左边长短list合并之后的每一个元素都小于右边的每一个元素。(只要决定了短list的切割位置,长lis的切割位置自然也就定了。因为median的性质决定的,必须分开的两边元素个数相等)。只有找到了切割位置之后,再从左边挑最大值(长list短list的左边末尾两个值)和右边最小值(长list短list的右边最头的两个值),取平均数,才是题目要求的median。

没有找到切割位置的时候,如果短左尾大于长右头,那么说明切割位置还要再往左找。移右标。反之则反。

对了,要确保寻找切割位置的list是短list。

补上造这个思路重写一遍的结果。

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        if len(nums1) > len(nums2):
            nums1, nums2 = nums2, nums1
            
        nums1, nums2 = [float('-inf')] + nums1 + [float('inf')], [float('-inf')] + nums2 + [float('inf')]
            
        l, r = 0, len(nums1)-1 
        half = len(nums1 + nums2) // 2 - 2  # the number of elements each side should have
        
        while l <= r:
            nums1_l = (l+r)//2  # nums1, short list, cutting point
            nums2_l = half - nums1_l  # nums2, long list, cutting point
            
            sl, sr, ll, lr = nums1[nums1_l], nums1[nums1_l+1], nums2[nums2_l], nums2[nums2_l+1]
            if sl <= lr and ll <= sr:
                if len(nums1+nums2) % 2:
                    return min(lr, sr)
                else:
                    return (max(sl, ll) + min(lr, sr))/2
            elif sl > lr:
                r = nums1_l - 1
            else:
                l = nums1_l + 1
        

尤其要注意的是,两个list前后加了负无穷和正无穷之后(为的是解决当切割线位于头尾时那个判断切割线位置对不对的条件会出现idx出界的问题),half记得要多减去2,两个负无穷占了两个位。否则长list的切割线位置会不对, 偏右两位。(还是感觉那里有点别扭,回头再想想)

 runtime:

PWM调节DCDC参数计算原理 SOC芯片的核电压、GPU电压、NPU电压、GPU电压等,都会根据性能和实际应用场景来进行电压和频率的调整。 即动态电压频率调整DVFS(Dynamic Voltage and Frequency scaling),优化性能和功耗。 阅读详情

相关推荐

android usb读写,安卓(Android)下如何开发USB NFC读写器app

对安卓工程师来说,在安卓下使用USB设备需要了解很多硬件的内容,这可能会导致工程周期的延长或者app的不稳定。为了将这种风险降到最低,友我科技发布了NFC读写器在安卓下的sdk,使用NFC读写器的类接口,安卓工程师就可以直接调用NFC读写器了,简单可靠。NFC读写器的安卓库文件为:yoworfidreader.jar在ADT工程中导入yoworfidreader.jar库文件,即可在工程中引用NF...

weixin_36433781的博客 822

Leetcode每日一题:287.find-the-duplicate-number(寻找重复数)

思路:一开始并没有什么头绪,直接排序加遍历以O(nlgn)的复杂度水过去了,后来看评论才知道有Floyd判圈算法这么秒的方法,简称龟兔赛跑; 具体算法讲解可参考文章:算法-floyd判环(圈)算法,讲得很棒,便于理解; // 先排序再查找 O(nlgn) // static bool cmp(int a, int b) // { // return a &lt; b; // } // int findDuplicate(vector&lt;int&gt; &amp;nums) // { // i.

CodeLuweir 的博客 240

如何用ISBN API快速获取图书信息?Python实战教程(附完整代码)

本文是一篇Python实战教程,详细介绍了如何利用ISBN API高效获取图书元数据。内容涵盖从API服务选择、密钥管理,到使用requests库构建健壮的请求模块,并利用Pydantic进行数据验证与解析。教程还提供了批量查询、缓存优化及集成到Flask Web应用等高级技巧,帮助开发者快速实现图书信息的自动化获取与处理。

p8q9r0的博客 455

LeetCode-287. Find the Duplicate Number [C++][Java]

Given an array of integers nums containing n + 1 integers where each integer is in the range [1, n] inclusive. There is only one repeated number in nums, return this repeated number.

贫道绝缘子的博客 958

手撕代码系列:Conv2D

在实际的神经网络中,每个卷积核都会对应一个偏置值。这意味着如果网络有多个卷积核,每个卷积核的输出都可以加上对应的偏置。

qq_55794606的博客 907

金仓数据库KCM认证考试介绍【2025年4月更新】

金仓数据库认证资深专家KCM认证考试介绍

qq709869231的博客 3227

Find the Duplicate Number

Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), prove that at least one duplicate number must exist. Assume that there is only one duplicate number, fi

427

银河麒麟V10新特性解析:从安装到AI应用的全面指南

本文全面解析银河麒麟V10操作系统的新特性,从安装指南到AI应用开发,详细介绍了其智能调度引擎、神经网络加速和场景化AI工具集等核心功能。通过实战案例展示如何高效配置AI环境、优化性能,并解决常见问题,助力开发者在国产操作系统上实现高效AI开发与应用部署。

seed的博客 299

287. Find the Duplicate Number(找到重复的数字)

给定的阵列NUMS含有Ñ + 1的整数,其中每个整数在1和之间Ñ(含),证明了至少一个重复数必须存在。假定只有一个重复的数字,找到重复的一个。 注意: 您不得修改数组(假设数组是只读的)。 您只能使用常数O(1)的额外空间。 您的运行时复杂度应小于O(n 2)。 数组中只有一个重复的数字,但是可以重复多次。 思路: 不能使用额外空间,因为数字是从1~n !,一共有n+1个数字,所以每一个数字都是可...

AAAtang 299

CNN+LSTM+Attention+DNN模型实战:pytorch搭建CNN+LSTM+Attention+DNN行车速度预测

CNN+LSTM+Attention+DNN模型实战:pytorch搭建CNN+LSTM+Attention+DNN行车速度预测

6045

使用STARTER V5.6软件将项目文件下载到S120驱动器控制单元CF卡中的具体方法演示

使用STARTER V5.6软件将项目文件下载到S120驱动器控制单元CF卡中的具体方法演示

Robot_PLC_HMI_Automation 1912

Java描述 LeetCode,287. Find the Duplicate Number 寻找重复数

两种方法,从循环链表中找出思路

人在江湖 975

GB9706.1-2020应用部分如何理解?

医用电气设备对应用部分的温度限制,绝缘考核,漏电流限制要求相对设备的其他部分来说都会要求比较严格。所以,划分设备的应用部分显得非常重要。现实中,医疗器械种类繁多,形状各异,比如大家熟悉的,小的如血压计,大的设备如CT。有些时候,我们应该如何根据应用部分的定义来确定ME设备的哪些部分是应用部分呢?还有GB 9706.1-2020中关于“应用部分”的定义中注2我们又该如何理解? 看过GB 9706.1-2020的朋友应该都已经注意到,相比老版也就是07版的9706.1,应用部分的定义是相对变...

喵叫兽的博客 8294

LeetCode 287. Find the Duplicate Number

Given an array of integers nums containing n + 1 integers where each integer is in the range [1, n] inclusive. There is only one duplicate number in nums, return this duplicate number. Follow-ups: How can we prove that at least one duplicate number must ex

Black_Cater的博客 223

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Leetcode287. Find the Duplicate Number

假设一个数组中只有一个重复的整数,其余元素各不相同,找出这个同步的数。不可以更改原数组,要求空间复杂度为O(1)。

magic_jiayu的博客 231

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

[LeetCode] 287. Find the Duplicate Number

Given an arraynumscontainingn+ 1 integers where each integer is between 1 andn(inclusive), prove that at least one duplicate number must exist. Assume that there is only one duplicate numbe...

a0712104790的博客 149

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

LeetCode题解(0287):寻找重复数(Python)

题目:原题链接(中等) 标签:数组、双指针、二分查找 解法 时间复杂度 空间复杂度 执行用时 Ans 1 (Python) O(N)O(N)O(N) O(N)O(N)O(N) 44ms (76.83%) Ans 2 (Python) Ans 3 (Python) 解法一: class Solution: def findDuplicate(self, nums: List[int]) -&gt; int: return collections.

长行 456

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 352

LeetCode Hot 100 链表专题 三· 3 题(Java)

收录题目:2. 两数相加、19. 删除链表的倒数第 N 个结点、24. 两两交换链表中的节点。 统一结构:① 题目分析与解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结。 贯穿三题的两条主线:虚拟头结点 dummy(统一处理头结点被修改的场景)与 指针修改顺序(避免断链、丢引用)。

2401_88612756的博客 481

LeetCode 每日一题 2026/11/2-2026/11/8

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步

AlphaTao的博客 174

LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)

LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等) 题目描述: 给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串: - s = s1 + s2 + ... + sn - t = t1 + t2 + ... + tm - |n - m| <= 1 - 交错 是 s1 + t

huayimenghan的博客 198

LeetCode 1861. 旋转盒子|Go 双指针解法

j >= 0,如果写成j>0,会漏掉第 0 列,最左侧石头处理失败旋转矩阵行列互换:原 m 行 n 列 → 结果 n 行 m 列,make 数组长度不要写反旋转公式m-1-i:是原总行数 m,不是 n!很容易写成n-1-i区分:本题和轮转数组(189)分组循环不一样!189:所有元素固定移动 k 步,需要 gcd 分组1861:障碍物分割成多个独立段,石头向段末尾挤,用双指针更合适。

2503_92676540的博客 175

Hash表:两数之和、字母异位词分组、最长连续序列 [力扣 Hot100]

三道高频哈希表应用题:两数之和(利用HashMap快速查找补数)、字母异位词分组(排序后作为键分组)、最长连续序列(通过HashSet去重并仅从序列起点扩展)。核心思想均为借助哈希结构优化查找效率,避免重复计算。同时提及双指针等其他解法思路,体现算法设计中“空间换时间”的典型策略。

2403_87560480的博客 197

LeetCode 3926. 统计有效单词的出现次数【分组循环】

核心思想:用分组循环,一趟遍历字符串,把一个个单词切出来,丢进哈希表统计频次。,先把所有片段拼接成完整文本字符串。,依次返回每个单词在文本里的出现次数。难点:内层循环的判断条件,区分。

2503_92676540的博客 166

力扣第526场周赛心得理解

思路:因为题目要求尽可能求出最小的最大值,而满足要求最小公约数为2,作为题目要求最小的最大值,先去求出它的最大公约数再通过value判断最左边是否大于0,以及value本身是否大于0,而index的位置只能为中间或者最右边,所以最后输出只能是value本身或者在这个基础上加相隔相应距离次数的结果。两个整数,是指将第二个整数的所有十进制数位拼接在第一个整数的所有十进制数位之后。如果不存在这样的数组,返回 -1。4097. 合并整数后的最小值。返回所有合并后得到的整数中的。合并,依此类推,直到将。

目前主攻编程,目标是把屏幕上的红波浪线变成流畅运行的程序♪(^∀^●)ノシ 198

LeetCode 0453.最小操作次数使数组元素相等:两次遍历(反向思维)

【LetMeFly】453.最小操作次数使数组元素相等:两次遍历(反向思维)

<font color="Pink">Tisfy的博客</font> 202
上一篇: Leetcode日练笔记11 #350 #167 Intersection of Two Arrays II & Two Sum II - Input array is sorted
下一篇: Leetcode日练笔记13 #485 #1295 #977 Max Consecutive 1s & Find Nums with Even Number of Digits & Squares
BabyFennec
博客等级 码龄9年 0粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值