前言
仅记录学习笔记,如有错误欢迎指正。
题目:
leetcode的洗衣机问题
思路:
首先看能不能数量相等 总和%机器数量 = 0
然后分情况讨论:对于任何一个位置都有至少需要搬动n次,最大值就是答案!
题目2:
思路:
不能纠结单个点的移动,宏观思路去打印
记录左上角A和右下角B的位置,调用f()去打印以这两个点所构成的矩阵,
顺序从左到右,从上到下;之后A往右下角移动,B往左上角移动;
当A,B错开时,结束循环。
题目3:
思路:先分析外围的转动,对于一个N*N的矩阵,分为N-1组,每个点的运动轨迹
题目四:
思路:
先统计每个字符出现的次数,然后建立容量为k的小根堆,
当堆满时,再插入新的字符,和堆顶比较,次数如果比堆顶的次数大,
堆顶remove,新数据入堆
dp的空间压缩
题目五:
思路:先找出最大的数字,然后如果最大的数字在左边,相对右部分的最大值就是最后一个数字,右边同理
有点类似于贪心?
题目六:
思路:
首先判断两个字符是不是长度相等,不等return false;
例如 a= “1234” b =“2341”
让a = a + a;然后判断b是否为a的字串(KMP)
如果b是a的字串,就return true;
题目七:
题目八:
找工作问题
思路:
先把所有的工作按照难度从小到大,价值从大到小排列
之后删除相同难度下,价值小的工作,
以及工作难度大,价值还比工作难度小工作价值的工作
最后选择工作只要选择恰好匹配能力的工作就是回报最大的工作!
二叉树专题:
题目九:
思路:
对于每个二叉树节点,如果左右孩子都转化好为双向链表了
只要左孩子的尾,和有右孩子的头互相连接
之后左孩子的头,和有右孩子的尾作为整个链表表的头尾!
题目十:
改造:返回头结点
思路:对于head节点,判断以该节点为头是否是搜索二叉树,如果是,返回节点个数,不是返回-1
递归需要返回的信息:
- 可能性1 左子树为最大二叉搜索树
- 可能性2 右子树为最大二叉搜索树
- 可能性3 整颗树为最大二叉搜索树(左树最大值<head.val<右树最小值)
题目11:
子数组的最大累加和:
进阶:求子矩阵的最大累计和
思路:(压缩数组)
求0行的最大累计和,求出res
之后求0-1行的累计和,把0行对应位置的数字和1行的数字相加,去调用数组的最大累计和方法
和之前的res比较,取较大者。
题目12:
数组的最长子序列的长度
优化思路:
新增一个数据用来当前长度的最小结尾!ends
之后每次遇见新的数字,先去ends中找大于当前数的最左位置,
如果存在就更新为新的数字,因为新数字一定比之前的数字小
如果不存在,那就在当前i位置插入此数字
dp[i] = ends数组中所在位置i+1;
题目13:
思路 :
如123,只需要(1+2+3) %3 ==0 来判断是否能被3整除
用等差数列之和的公式来算和
题目14:
思路:
从左到右,对于i位置的值x,找到下标为x-1的位置,交换位置,
直到交换的位置等于i+1
开始下一轮;i++
输出x !=i+1的值