11 2020 档案
摘要:700. 二叉搜索树中的搜索 思路 首先搞清楚二叉搜索树的机制,左儿子的值都小于当前节点,右儿子的值都大于当前节点 然后就可以快速写出程序了,用递归很好实现 1. 相等直接return 2. 小于当前节点,直接去树节点的左子树寻找 3. 大于当前节点,去树节点的右子树寻找 # Definition
阅读全文
摘要:面试题 17.16. 按摩师 思路 典型的动态规划题目,存在多个子问题。这题与打家劫舍一模一样 这边我们设f(n)为接纳前N个客户的时长, a为预约数组 当n = 0的时候,显然f(n) = 0 当n = 1的时候,显然f(n) = a[n] 当n >= 2的时候,f(n) = max(f(n-2)
阅读全文
摘要:背景 是这样的,最近在研究一个定时任务系统的改造,可能有点像jenkins做到的那种吧。 可以输入shell命令,也可以执行py脚本等等,相比之前来说,也要能够及时停止! 但是遇到了这么个问题,golang执行py脚本的时候获取不到脚本的输出。 首先来看看go里面怎么运行shell脚本吧,我比较喜欢
阅读全文
摘要:62. 不同路径 思路 这题很简单,直接动态规划即可。 公式如下: # 到达i j坐标可以从上往下也可以从左往右 f(i, j) = f(i-1, j) + f(i, j-1) (当i > 0 and j > 0) f(i, j) = 1 (当i=0或者j=0) 靠边只有1种方案 class Sol
阅读全文
摘要:147. 对链表进行插入排序 思路 维护一个排好序的链表,剩下的值如果比已排好的大,直接放到尾部,如果比之前小,则从链表头遍历,找到对应的位置并插入。 为了很好找到链表头,需要设置一个哑节点。 # Definition for singly-linked list. # class ListNode
阅读全文
摘要:283. 移动零 思路 双指针 左指针指向左边已经排好序的尾部,右指针指向当前数字,右指针如果指向的数字不为0,则交换左右指针。 注意:当非0数字在前面时,左右指针会相等。 class Solution: def moveZeroes(self, nums: List[int]) -> None:
阅读全文
摘要:31. 下一个排列 思路 首先说一下什么是字典序,把1 2 3当作a b c的话,abc有6种排列顺序。 abc acb bac bca cab cba 上图就是字典序,题目的要求狠简单: 找到下一个字典序,如果没有的话,则输出最小的序号。 首先明确一下,没有下一个序列的情况,那么就是大的全部在前面
阅读全文
摘要:34. 在排序数组中查找元素的第一个和最后一个位置 思路 看到排序数组,基本上二分解法占一半,记得刚开始去字节面试的时候,面试官出了一题找出数组(先递增再递减)的峰值,也就是什么时候开始递减的。 答的是扫描,那样如果峰值很靠后的话,算法不是最优解,利用二分可以达到O(logN),虽然最终在面试官的引
阅读全文
摘要:221. 最大正方形 动态规划 求的是最大面积,可以转换为求最大边长。 创建一个二维数组dp dp是以i, j坐标为右下角的正方形的最大边长。 状态转移方程式: matrix[i][j] == "1"的时候: f(i, j) = min(f(i-1, j), f(i, j-1), f(i-1, j-
阅读全文
摘要:11. 盛最多水的容器 思路 这题有点像接雨水,但是比接雨水简单的是,这个中间是没有木棍的,所以很容易计算出2根棍子能装多少水。 根据木桶效应,容器装水多少是根据最短那块来决定的。 本题用双指针的方式,首先比较两侧木板较短的那块板子,记录下值,如果右侧小则右侧的指针移动,为啥呢,因为右侧可能会有更高
阅读全文
摘要:重点 首先注意几个重点: 1. arr1和arr2里最大的元素不会超过1000 2. arr2里面没有重复的元素 3. arr2里面每个元素必定在arr1里面出现 思路 1. 先创建一个大小为1001的数组data用来存放arr1中每个元素出现的次数(因为最大值可能是1000),其实这里可以简化,只
阅读全文
摘要:题目: 328. 奇偶链表 思路 定义3个指针,分别为jishu(指向第一个节点), oushu(第一个偶数节点)和oushu_head(第一个偶数节点) # Definition for singly-linked list. # class ListNode: # def __init__(se
阅读全文
摘要:题目链接: 922. 按奇偶排序数组 II 思路 很简单,搞懂问题的核心就行,假设现在有奇数在偶数位上,偶数在奇数位上。 那么我们要做的就是,找到分别在对方位置上的数字,然后交换他们就行。 class Solution: def sortArrayByParityII(self, A: List[i
阅读全文
摘要:题目链接: 15. 三数之和 解法 暴力法 首先可以确定的是暴力法的时间复杂度是O(N³), 所以基本上不考虑此等解法。 排序+双指针 思路是先将数组排序(从小到大),然后固定数组的第一位。 定义2个指针(左右指针)分别指向定位数组的后一位和数组最后一位。 如果3个数字加起来比0小,则左指针右移,循
阅读全文
摘要:hash表 1. 思路很简单,先遍历数组,存储每个元素的个数 2. 遍历hash表,拿到大于 n/2的数字,直接return class Solution: def majorityElement(self, nums: List[int]) -> int: hash = dict() for n
阅读全文
摘要:首先要弄清楚题目的意图,曾经在字节面试遇到过类似的题目,但那题是需要找出这个峰值。 所以解法也肯定不一样。 官方给的题解是直接遍历,我们这里采用双指针分别从头和尾往中间遍历,如果山脉符合要求,那么2个指针会停在同一个山脉。 class Solution: def validMountainArray
阅读全文
摘要:空间换时间,hash表2次遍历(Python) 潇洒解法: 利用Python的set数据结构,完成交集操作 class Solution: def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]: return
阅读全文