算法
介绍常用的算法
龍的天空
一枚流浪社会的码农
展开
-
回溯法求解N皇后
题目:解法:这道题用回溯法求解,我们从第一行开始尝试放棋子,如果这一行有位置不冲突就放下去,继续下一行,如果这一行没有可行的位置就回溯到上一行,以此类推下去。检测对角线是否冲突是有规律的,下面这种的规律是:对于同一对角线的元素,他们的横坐标与纵坐标相加的和是相等的,数量为2*n-1个;而这种的规律是:对于同一对角线的元素,他们的横坐标与纵坐标相减的和是相等的,数量也为2*n-1个;class Solution { private boolean[] col; .原创 2020-06-02 10:20:33 · 205 阅读 · 0 评论 -
回溯法求解组合问题
题目:典型的回溯算法问题,就是在一颗决策树上一直做选择,没有可以选择的时候就撤销选择,class Solution { List<List<Integer>> res=new ArrayList<>(); public List<List<Integer>> combine(int n, int k) { if(n<=0 || k<=0) return res; Lis.原创 2020-05-31 16:09:11 · 1911 阅读 · 0 评论 -
剑指offer:二进制中1的个数
题目:解题:用&运算(&运算的规则就是两个1做&运算结果为1,其他为0) ,对于n-1,它的 最右边的1相比n 变成0,此1右边的0都变成1。n跟n-1做&运算的时候会消去最右边的一个1,所以每次消去一个1就计数一次,直到n等于0为止:public class Solution { // you need to treat n as an unsigned value public int hammingWe...原创 2020-05-28 18:28:32 · 183 阅读 · 0 评论 -
面试题13:机器人的运动范围
题目:题解:典型的dfs问题,可以理解为在行坐标和列坐标的数位之和小于等于k的情况下,从左上角走到右下角一共可以走多少步。class Solution { private int count=0; //结果数 public int movingCount(int m, int n, int k) { boolean [][] visit=new boolean[m][n]; //走过的坐标记录下来 dfs(0,0,m,n,k,visit);原创 2020-05-27 22:08:39 · 173 阅读 · 0 评论 -
BFS求解腐烂的橘子
题目:分析:这道题其实就是求腐烂橘子到所有新鲜橘子的最短路径。直接用BFS遍历整个图,把所有新鲜的橘子都感染。class Solution { public int orangesRotting(int[][] grid) { int row=grid.length; //行 int col=grid[0].length; //列 Queue<int []> queue=new LinkedList<>(); /.原创 2020-05-19 16:47:14 · 232 阅读 · 0 评论 -
LinkedHashMap实现LRU缓存
题目:解答:java集合类中LinkedHashMap是基于哈希链表结构的,刚好用来实现LRU缓存很方便。class LRUCache {private int capacity;Map<Integer,Integer> map; //构造函数 public LRUCache(int capacity) { this.capacity=capacity; map=new LinkedHashMap<>(); //哈希原创 2020-05-15 14:39:35 · 166 阅读 · 0 评论 -
二维数组的查找
题目:解答:根据二维数组从上到下,从左从右递增的特点,我们可以从右上角出发开始比较 。1.如果等于目标数就返回结果;2.如果小于目标数就向下移动;3.如果大于目标数就向左移动;class Solution { public boolean findNumberIn2DArray(int[][] matrix, int target) { if (matrix.length == 0 || matrix[0].length == 0) { .原创 2020-05-14 17:33:10 · 183 阅读 · 0 评论 -
二叉树的层次遍历
二叉树的层次遍历也叫广度优先遍历,用队列来实现:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public List<List<Integer>原创 2020-05-11 20:47:44 · 146 阅读 · 0 评论 -
限流算法之RateLimiter的使用
RateLimiter的底层是基于令牌桶算法来实现的,来自谷歌的Guava包中,所以我们要先引入依赖: <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>28.0-jre<...原创 2020-04-29 10:20:11 · 4343 阅读 · 0 评论 -
计算字符串中有多少回文子串
判断回文串我们可以从中间向两边遍历:public static int isPalindrome(String s,int left,int right){ if(s==null) return 0; while(left>=0 && right<s.length() && s.charAt(left)==s.c...原创 2020-04-28 23:04:43 · 689 阅读 · 0 评论 -
LeeCode198:打家劫舍
题目:题解:动态规划的典型例子, 核心思路:小偷从左到右走过这一排房子,在每间房子前都有两种选择:抢或者不抢。假设小偷在某个房间,那么小偷现在就有两个选择,第一是偷这个房子以及这个房子隔壁的隔壁的房子,第二是不偷我现在所在的房子而偷隔壁的房子。class Solution { public int rob(int[] nums) { int len=nums.l...原创 2020-04-28 11:07:48 · 163 阅读 · 0 评论 -
链表中倒数第k个节点
题目:Java代码题解:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public L...原创 2020-04-20 23:22:06 · 89 阅读 · 0 评论 -
双指针之滑动窗口
一.长度最小的子数组这道题怎么做呢?当然是用滑动窗口,标题都说了。。首先设置两个指针l和r,设置最小长度result为最终结果,接着r开始向右滑动,每次滑动一次求和sum,与s比较。当遍历到第四个数2时 ,此时sum已经大于7,这时候记录下来长度result=(r-l+1),接着我们要看后面有没有符合条件并且长度更小的,l右移直到sum<s,此时...原创 2019-11-20 11:06:13 · 233 阅读 · 0 评论 -
盛最多水的容器
题目描述:一.暴力破解这道题如果没其他思路的话先考虑一下暴力破解,本质上就是求最大的矩形面积,我们可以用暴击破解把每个矩形面积都算出来,再取最大的那一个就行了。如上图所示,ai和aj组成的矩形的长度为(j-i),宽度取决于ai和aj较短的那一个,根据这个规律,写代码就很简单了。public class ChengShui { public int maxArea(...原创 2019-11-20 10:57:05 · 92 阅读 · 0 评论 -
异或运算的骚操作
异或运算的规则就是两个相同的数异或之后的结果为0,0和其他不为0的数异或之后的结果为后者,而且异或运算支持交换律和结合律,有了这些定义使得有些算法可以很巧妙的使用异或运算解决问题。一.交换两个数的值 我们平时交换两个数的一般写法是借助中间变量来实现的,而用异或运算可以不用中间变量。public static void main(String[] args) { int a=1...原创 2019-11-20 10:54:21 · 583 阅读 · 0 评论 -
二叉树前中后序非递归遍历
最近在复习算法和数据结构的东西,直接在LeeCode上刷点题,先从二叉树的三层遍历做起。先说明一下前中后序遍历的定义:前序:根节点->左子树->右子树;中序:左子树->根节点->右子树;后序:左子树->右子树->根节点;由于前中后序遍历都涉及回溯的过程,本质上是深度优先遍历,深度优先遍历可以用栈和递归实现,本文讲的是非递归遍历,所以用栈实现,...原创 2019-11-20 10:48:43 · 227 阅读 · 0 评论 -
接雨水问题
接雨水问题:一.问题分析刚开始看到题目的时候再多看几眼还是没什么头绪,于是试着从左到右一点一点推到下去。 首先数组的第一个和最后一个元素有一边没有边界,所以这两个不用考虑,只考虑从1到n-2个元素。 2装不了水,因为左边没有柱子挡着;3可以装水,因为两边有柱子挡着,而且两边的柱子都比它高;4装不了水,原因是虽然它两边有柱子,但是因为2比它矮;5能装...原创 2019-11-20 10:40:14 · 276 阅读 · 0 评论 -
删除链表中的重复元素II
题目描述:给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有重复出现的数字。示例1:输入: 1->2->3->3->4->4->5输出: 1->2->5示例2:输入: 1->1->1->2->3输出: 2->3这道题是LeeCode上第82道题,这道题刚开始我的想法是...原创 2019-11-20 10:26:52 · 265 阅读 · 0 评论