算法题整理

Leetcode 没维护链接

ID Title Difficulty Java Python C++ SQL
1 Two Sum Easy YES YES
2 Add Two Numbers Medium YES YES
3 Longest Substring Without Repeating Characters Medium YES YES
4 Median of Two Sorted Arrays Hard YES
5 Longest Palindromic Substring Medium
6 ZigZag Conversion Medium
7 Reverse Integer Easy YES YES
8 String to Integer (atoi) Medium YES/Solution.java) YES/Solution.py)
9 Palindrome Number Easy YES YES
10 Regular Expression Matching Hard YES
132 * Palindrome Partitioning II Hard YES YES
176 Second Highest Salary Easy YES
183 Customers Who Never Order Easy YES
344 Reverse String Easy YES YES
437 Path Sum III Medium YES
532 K-diff Pairs in an Array Easy YES
620 Not Boring Movies Easy YES
677 Map Sum Pairs Medium YES
729 My Calendar I Medium YES YES
907 Sum of Subarray Minimums Medium YES YES
917 Reverse Only Letters Easy YES
985 Sum of Even Numbers After Queries Easy YES
994 Rotting Oranges Easy YES
1262 Greatest Sum Divisible by Three Medium YES

剑指

ID Difficulty Java Python C++ SQL
JZ3 数组中重复的数字 Easy YES
JZ4 二维数组中的查找 Medium YES
JZ5 替换空格 Easy YES
JZ6 从尾到头打印链表 Easy YES
JZ7 重建二叉树 Medium YES
JZ8 二叉树的下一个结点 Medium YES
JZ9 用两个栈实现队列 Easy YES
JZ10 斐波那契数列 Easy YES
JZ11 旋转数组的最小数字 Easy YES
JZ12 矩阵中的路径 Medium YES
JZ13 机器人的运动范围 Hard YES
JZ14 剪绳子 Medium YES
JZ15 二进制中1的个数 Easy YES

第4题

这道题让我们求两个有序数组的中位数,而且限制了时间复杂度为O(log (m+n)),看到这个时间复杂度,自然而然的想到了应该使用二分查找法来求解。那么回顾一下中位数的定义,如果某个有序数组长度是奇数,那么其中位数就是最中间那个,如果是偶数,那么就是最中间两个数字的平均值。这里对于两个有序数组也是一样的,假设两个有序数组的长度分别为m和n,由于两个数组长度之和 m+n 的奇偶不确定,因此需要分情况来讨论,对于奇数的情况,直接找到最中间的数即可,偶数的话需要求最中间两个数的平均值。为了简化代码,不分情况讨论,我们使用一个小trick,我们分别找第 (m+n+1) / 2 个,和 (m+n+2) / 2 个,然后求其平均值即可,这对奇偶数均适用。加入 m+n 为奇数的话,那么其实 (m+n+1) / 2 和 (m+n+2) / 2 的值相等,相当于两个相同的数字相加再除以2,还是其本身。

这里我们需要定义一个函数来在两个有序数组中找到第K个元素,下面重点来看如何实现找到第K个元素。首先,为了避免产生新的数组从而增加时间复杂度,我们使用两个变量i和j分别来标记数组nums1和nums2的起始位置。然后来处理一些边界问题,比如当某一个数组的起始位置大于等于其数组长度时,说明其所有数字均已经被淘汰了,相当于一个空数组了,那么实际上就变成了在另一个数组中找数字,直接就可以找出来了。还有就是如果K=1的话,那么我们只要比较nums1和nums2的起始位置i和j上的数字就可以了。难点就在于一般的情况怎么处理?因为我们需要在两个有序数组中找到第K个元素,为了加快搜索的速度,我们要使用二分法,对K二分,意思是我们需要分别在nums1和nums2中查找第K/2个元素,注意这里由于两个数组的长度不定,所以有可能某个数组没有第K/2个数字,所以我们需要先检查一下,数组中到底存不存在第K/2个数字,如果存在就取出来,否则就赋值上一个整型最大值。如果某个数组没有第K/2个数字,那么我们就淘汰另一个数字的前K/2个数字即可。有没有可能两个数组都不存在第K/2个数字呢,这道题里是不可能的,因为我们的K不是任意给的,而是给的m+n的中间值,所以必定至少会有一个数组是存在第K/2个数字的。最后就是二分法的核心啦,比较这两个数组的第K/2小的数字midVal1和midVal2的大小,如果第一个数组的第K/2个数字小的话,那么说明我们要找的数字肯定不在nums1中的前K/2个数字,所以我们可以将其淘汰,将nums1的起始位置向后移动K/2个,并且此时的K也自减去K/2,调用递归。反之,我们淘汰nums2中的前K/2个数字,并将nums2的起始位置向后移动K/2个,并且此时的K也自减去K/2,调用递归即可。

本文标题:算法题整理

文章作者:松子

发布时间:2019年04月23日 - 21:04

最后更新:2022年03月23日 - 13:03

博文链接:https://songzi.info/post/dabc0faf/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%