
笔记,算法
b9x_
只怕失望
展开
-
常见限流方式
计数器: if(GET(key)){ // 1.1自增后判断是否大于最大值,并返回结果 if(INCR(key) > maxPermit){ returnfalse; } returntrue; } //不存在key,则初始化key SET(KEY,1); EXPIRE(KEY,3); returntrue; 存在问题:单时间段轮换会存在重合时间段超发的情况。 解决:...原创 2021-09-17 17:43:17 · 248 阅读 · 0 评论 -
常见算法 - 链表相关:按大小将链表分列给定值左右
将链表按照一定规则排序,比给定值小的在给定值左边,大于等于的在其右边,要求是稳定的。(leetcode86)Input: head = 1->4->3->2->5->2, x = 3Output: 1->2->2->4->3->5思路: 先找到首个大于给定值的(insertNode),只有依次找到小于给定值的插入到insertNode之...原创 2018-05-06 20:09:58 · 307 阅读 · 0 评论 -
常见算法 - 链表相关:删除链表倒数第n个节点
多次了,两个指针,先确定其距离为n,之后一起走,当后一个走到最后一个时,前一个指向的就是倒数第n个了;代码实现起来因为要删除所以要找的时倒数第n+1个,以此来删除倒数第n个,即n+1的next。(leetcode19)public class L19RemovListNode { public static ListNode3 removeNthFromEnd(ListNode3 head,...原创 2018-05-06 20:24:39 · 153 阅读 · 0 评论 -
常见算法 - 链表相关:交换链表中每相邻的两个节点
常规的链表处理,需要另外的一个指针next记录下两个节点之后的第三个节点,保证节点不会丢失找不到。(leetcode24)class Solution { public ListNode swapPairs(ListNode head) { if(head == null){ return null; } ListNo...原创 2018-05-06 20:30:36 · 2251 阅读 · 0 评论 -
常见算法 - 链表相关:将链表的尾节点移动到最前位置n次
将链表的尾节点移动到头结点处,再完成后的链表再执行该操作,共执行n次。Input: 0->1->2->NULL, k = 4Output: 2->0->1->NULLExplanation:rotate 1 steps to the right: 2->0->1->NULLrotate 2 steps to the right: 1-&...原创 2018-05-06 20:50:35 · 1445 阅读 · 0 评论 -
常见算法 - 链表相关:找到链表中的环入口并返回
找到一个链表中的环入口并且返回,不存在返回空。(剑指offer)思路:两个指针,快指针走两步,慢指针走一步,如果快指针可以追上慢指针,说明存在环,此时,让其中一个指针从头节点开始,两个指针同一步伐走,再相遇时就是环入口了。数学依据:假设x为环前面的路程,a为环入口到相遇点的路程, c为环的长度 当快慢指针相遇的时候:此时慢指针走的路程为Sslow = x + m * c + a 快指针走的路程...原创 2018-05-06 21:11:02 · 136 阅读 · 0 评论 -
常见算法 - 二叉树:二叉树的遍历(递归与非递归)
二叉树的前序、中序、后序遍历:递归实现:不同顺序改变递归就行。前序: class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer> list = new ArrayList<Integer...原创 2018-05-07 14:15:12 · 190 阅读 · 0 评论 -
常见算法 - 求一个字符串的可以拆分成多个回文串的所有情况
给定一个字符串,求可以把它拆分多个回文字串的所有可能情况(leetcode131):Given a string s, partition s such that every substring of the partition is a palindrome.Return all possible palindrome partitioning of s.Example:Input: "aab"...原创 2018-05-14 09:44:15 · 2697 阅读 · 0 评论 -
常见算法 - 返回最少个整数的平方和等于给定值的个数
给出一个正整数n,寻找最少的完全平方数,是他们的和为n。(leetcode279)For example, given n = 12, return 3 because 12 = 4 + 4 + 4; given n = 13, return 2 because 13 = 4 + 9.思路:以图的思想,每两个数相差一个完全平方数就连接一条边,即求n到0的最短路径;另外,用set标志当前数是否判断过...原创 2018-05-07 15:34:09 · 1498 阅读 · 0 评论 -
常见算法 - 求给定字符串在字符串数组中转变成另一字符串的最少次数
Leetcode(127):Input:beginWord = "hit",endWord = "cog",wordList = ["hot","dot","dog","lot","log","cog"]Output: 5Explanation: As one shortest transformation is "hit&q原创 2018-05-07 19:03:08 · 1414 阅读 · 0 评论 -
常见算法 - 给定一个数组数字求其的全排列 && 求1~n选k个数的所有组合
leetcode46:Given a collection of distinct integers, return all possible permutations.Example:Input: [1,2,3]Output:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]思路:回溯法的练习题。因为我们...原创 2018-05-14 21:17:40 · 1845 阅读 · 0 评论 -
常见算法 - 求给定数组中出现频率最高的前n个数
(leetcode347):Given a non-empty array of integers, return the k most frequent elements.For example,Given [1,1,1,2,2,3] and k = 2, return [1,2].思路:(常规)遍历数组,记录数值及对应的频率,再排序找出前k个。 用map存储数值及对应频率...原创 2018-05-08 19:45:41 · 3973 阅读 · 0 评论 -
常见算法 - 01背包
01背包是一个经典的问题。重点学习它的状态转移方程。01 背包问题:给定 n 种物品和一个容量为 C 的背包,物品 i 的重量是 w[i],其价值为 v[i] 。求应该如何选择装入背包的物品,使得装入背包中的物品的总价值最大?public int solution(int[] w,int[] v,int c){ int n = w.length; int[][] dp = new int[...原创 2018-05-26 21:29:20 · 407 阅读 · 0 评论 -
常见算法 - 硬币找零 && 等和拆分数组
硬币找零(leetcode322) class Solution { public int coinChange(int[] coins, int amount) { if(amount <= 0){ return 0; } if(coins.length == 0 ){ ...原创 2018-05-27 21:35:20 · 442 阅读 · 0 评论 -
常见算法 - 将给定整数分解成多个和为其的数,求乘积最大的一组数
给定一个数可以分割成多组和等于它的数组,求这样数组中乘积最大的一组(leetcode343)For example, given n = 2, return 1 (2 = 1 + 1); given n = 10, return 36 (10 = 3 + 3 + 4).Note: You may assume that n is not less than 2 and not larger tha...原创 2018-05-23 20:39:18 · 4910 阅读 · 0 评论 -
常见算法 - 最长上升子序列 && 最长升降子序列
动态规划练习:1.求给定数组的最长上升子序列(leetcode300)Input: [10,9,2,5,3,7,101,18]Output: 4 Explanation: The longest increasing subsequence is [2,3,7,101], therefore the length is 4. 思路:可以用动态规划求解,要注意状态的定义。dp[i]应为从0到i且...原创 2018-05-28 21:37:09 · 534 阅读 · 0 评论 -
常见算法 - 抢劫房间;如果抢劫相邻的两个房间就会报警,求能抢劫到的最大值
给定一组数据为房间里的价值,进行抢劫,如果抢劫相邻的房间就会报警,求安全情况下可以抢劫到的最大值(leetcode198)Example 1:Input: [1,2,3,1]Output: 4Explanation: Rob house 1 (money = 1) and then rob house 3 (money = 3). Total amount you c...原创 2018-05-24 20:40:04 · 4762 阅读 · 2 评论 -
常见算法 - 股票交易设计以获取最大值
根据每天的股票价值,设计算法以获取最大值。要求每天只能进行一种操作,买、卖、等待,只有买了之后才能且进行卖,不能连续买,卖了之后的一天必须等待什么都不能做。思路:来源leetcode讨论区。 s0代表当前状态未持有股票。s1当前状态持有股票。s2当前状态因卖出股票未持有股票,不同与s0。There are three states, according to the action that you...原创 2018-05-24 21:26:09 · 720 阅读 · 0 评论 -
常见算法 - 链表相关:反转列表指定范围内的节点
常规思路,范围内反转列表(leetcode92):public class L92ReverseLinkedListII { public static ListNode reverseBetween(ListNode head, int m, int n) { if(head == null){ return null; } ListNode temp = n...原创 2018-05-06 19:59:07 · 631 阅读 · 0 评论 -
常见算法 - 链表相关:反转链表
链表只要注意不要丢失掉对节点引用;多可设置虚拟头结点简化引用的处理。1.反转列表(leetcode206)public class L206ReverseLinkedList { public static ListNode reverseList(ListNode head) { if(head == null){ return null; } ListNode pre ...原创 2018-05-06 19:56:18 · 170 阅读 · 0 评论 -
常见算法 - 二叉树:二叉树的层次遍历&倒层次遍历
二叉树的层次遍历(leetcode102):1.非递归遍历,借助队列实现,队列多用于广度遍历:public class L102BinaryTreeLevelOrderTraversal { public static List<List<Integer>> levelOrder(TreeNode root) { List<List<I...原创 2018-05-06 19:44:32 · 828 阅读 · 0 评论 -
回溯法练习笔记
1.回溯法回溯法按深度优先策略搜索问题的解空间树,首先从根节点出发依次搜索解空间树进行遍历,搜索遍历过程中记录解,已至到最后求出最优解,都每一节点都利用剪枝函数判断该节点是否能继续往下搜索,也就是判断是否还会有解;如果可行,就继续向下搜索;如果不行,则跳过该节点所有可能继续向下的搜索。(行就接着往下搜,不行下面的就都不搜了) 剪枝函数是为了避免无效的搜索。剪枝函数一般:剪原创 2017-11-23 21:56:27 · 783 阅读 · 0 评论 -
回溯法练习笔记(二)
N皇后在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。你的任务是,对于给定的N,求出有多少种合法的放置方法。每次都要判断,对某一行每一列一次判断是否可以放置皇后。(不用判断行是否可以放,因为代码每次循坏是从下一行进行的)package com.lq.exercise06;import java原创 2017-11-23 22:02:37 · 300 阅读 · 0 评论 -
贪心算法练习笔记(一)
1.贪心算法每次都选择当前最好的,当前不考虑整体,用局部最优解最后得到整体的最优解。(感觉最简单好理解的一个算法)2.输入M,N,及N组数据,F[i],J[i];M是你有的资本,获取F[i]就要付出对应的J[i],钱不够可以按比例获取,求能获取到的最大值。 思路:每次用最少的钱获取最大的,即F[i]/J[i]最大,所以讲F[i]/J[i]排序,每次获取最大的,可以按比例,看M能获取到多原创 2017-11-28 10:25:50 · 300 阅读 · 0 评论 -
排序算法 - 冒泡排序和选择排序
冒泡排序的基本思想就是:从无序序列头部开始,进行两两比较,根据大小交换位置,直到最后将最大(小)的数据元素交换到了无序队列的队尾,从而成为有序序列的一部分;下一次继续这个过程,直到所有数据元素都排好序。即每次通过两两比较交换位置,选出剩余无序序列里最大(小)的数据元素放到队尾。package com.zx.sort;import java.util.Arrays;public cl...原创 2018-03-11 14:58:24 · 215 阅读 · 0 评论 -
排序算法 - 快速插入排序和希尔排序
快速插入排序和希尔排序都属于插入排序。 直接插入排序每趟将一个元素,按照其的大小直接插入到它前面已经排序的子序列中,依此重复,直到插入全部元素。 希尔排序是将序列先按一定距离进行分组然后在组内进行直接插入排序。快速插入排序:package com.zx.sort;import java.util.Arrays;public class Insertion { publ...原创 2018-03-11 16:53:11 · 414 阅读 · 0 评论 -
排序算法 - 归并排序
归并排序使用了一种叫做”分治“的思想来解决排序问题。分治也就是”分而治之“,也就是把一个大问题分解为众多子问题,而后分别得到每个子问题的解,最终以某种方式合并这些子问题的解就可以得到原问题的解。归并排序的主要思想是:将待排序数组递归的分解成两半,分别对它们进行排序,然后将结果“归并”(递归的合并)起来。当递归到数组只有一个元素时,这时候它们本身就有序,此时就可以进行归并了。归并时借助一个新数组,依次原创 2018-03-11 19:18:10 · 215 阅读 · 0 评论 -
排序算法 - 快速排序
快速排序很重要,接触很多次了。平均时间复杂度O(nlogn),最坏情况(有序时)O(n*n)。优化:1.递归到小数组时采用插入排序(希尔排序)。2.在切分元素上做优化package com.zx.sort;import java.util.Arrays;public class Partition { public static void main(String[]原创 2018-03-11 21:04:01 · 175 阅读 · 0 评论 -
排序算法 - 堆排序
堆排序时利用堆进行排序的。 堆:具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。堆左右孩子之间的大小没有要求。 堆排序的基本思想是:将待排序序列构造成一个大顶堆(小顶堆),此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样原创 2018-03-11 21:31:25 · 230 阅读 · 0 评论 -
常见算法 - 按大小合并多个有序链表
leetcode(23):Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.Example:Input:[ 1->4->5, 1->3->4, 2->6]Output: 1->1->2->...原创 2018-05-08 20:54:37 · 325 阅读 · 0 评论 -
常见算法 - 二叉树:(递归)求深度、是否包含某节点、删除节点
二叉树本身天然的递归结构,很多对二叉树的操作都可以用递归解决。如遍历节点、删除节点、找某节点、求深度等。求深度(leetcode104):class Solution { public int maxDepth(TreeNode root) { if(root == null){ return 0; } ...原创 2018-05-08 21:27:55 · 510 阅读 · 0 评论 -
Spring - Spring中的BeanFactory和ApplicationContext之间的区别和联系
总体上讲: BeanFactory是Spring中最基本、通用的工厂,这里的工厂,其不仅仅是构造实例,它可以创建并管理各种类的对象,即是Spring IOC容器体系结构的基本接口,其与其子接口便构成了Spring IOC容器的体系结构(如下图:IOC容器主要接口关系图)。所以不要把它理解成常规意义的简单工厂,也可以把它称为Sring容器。 而A...原创 2018-05-10 15:59:58 · 2649 阅读 · 0 评论 -
常见算法 - 二叉树:(递归) 求镜像、判断两棵树是否一样、判断二叉树是否是对称的、判断根到叶子结点是否有路径和等于n
求镜像(leetcode226):class Solution { public TreeNode invertTree(TreeNode root) { if(root == null){ return root; } TreeNode temp = root.left; ro...原创 2018-05-10 20:24:51 · 587 阅读 · 0 评论 -
常见算法 - 从给定数组中选取任意个数(可重复),使其和为给定值。
...原创 2018-05-17 18:52:02 · 6116 阅读 · 0 评论 -
常见算法 - 二叉树:(递归) 求根节点到叶子节点的所有路径、求二叉树中和为定值的任意路径
求根节点到叶子节点的所有路径Leetcode(257):递归的简单应用,注意返回的是所有路径,所以当前节点要于子节点的所有路径都连接一次。class Solution { public List<String> binaryTreePaths(TreeNode root) { List<String> res = new Arra...原创 2018-05-11 21:17:04 · 5818 阅读 · 1 评论 -
常见算法 - 二叉搜索树:求两个节点的公共祖先节点、判断是否是二叉搜索树
leetcode235:Given binary search tree: root = [6,2,8,0,4,7,9,null,null,3,5] _______6______ / \ ___2__ ___8__ / \ / \ 0 _4 7 ...原创 2018-05-11 21:42:47 · 358 阅读 · 0 评论 -
常见算法 - 在二维平面内搜索字符路径
给定一组二维字符,对于每个字符只能向上下左右某个方向走,求是否有路径经过的字符串恰好是给定的字符串(leetcode79):Example:board =[ ['A','B','C','E'], ['S','F','C','S'], ['A','D','E','E']]Given word = "ABCCED", return true.Given word = "SEE",...原创 2018-05-18 11:35:35 · 313 阅读 · 0 评论 -
常见算法 - 根据输入数字按手机九建求可能组合成的字符串
根据输入数字按手机九建求可能组合成的字符串(leetcode17):Given a string containing digits from 2-9 inclusive, return all possible letter combinations that the number could represent.A mapping of digit to letters (just like ...原创 2018-05-12 21:26:02 · 598 阅读 · 0 评论 -
动态规划学习笔记
动态规划拆分问题,定义问题状态和状态之间的关系,每一状态解决一次,使得问题能够以递推的方式去解决。动态规划其实感觉和递归想法差不多,就是递归每次每一步都要重复计算,导致复杂度很高,动态规划就是每一步就计算一次,把这一状态保存下来,下回用的时候直接就用了,很高效。动态规划解题的一般思路 1. 将原问题分解为子问题 把原问题分解为若干个子问题,子原创 2017-11-06 17:07:27 · 307 阅读 · 0 评论