算法
wuli_凡凡
想通过写技术博客和大家交流
展开
-
排列组合的问题
返回所有不重复的全排列。原创 2023-05-24 10:52:07 · 115 阅读 · 0 评论 -
递归的理解
递归的例题,给读者思考原创 2022-08-03 16:23:20 · 530 阅读 · 0 评论 -
BFS的常见算法题-二叉树的最小深度
BFS的使用原创 2022-07-31 17:54:13 · 289 阅读 · 0 评论 -
54. 螺旋矩阵 和 59. 螺旋矩阵 II
螺旋打印矩阵原创 2022-07-15 18:30:31 · 180 阅读 · 0 评论 -
33.搜索旋转排序数组
33. 搜索旋转排序数组原创 2022-07-15 11:49:35 · 209 阅读 · 0 评论 -
动态规划-最长回文子串
最长回文子串原创 2022-07-06 16:14:36 · 243 阅读 · 0 评论 -
动态规划-打家劫舍
动态规划算法题原创 2022-07-04 17:11:28 · 160 阅读 · 0 评论 -
数组操作的算法题
算法题中,对数组的操作原创 2022-06-14 18:42:35 · 142 阅读 · 0 评论 -
滑动窗口法的题目
目录最长不重复字串(连续)长度最小的子数组最大连续1的个数最长不重复字串(连续)如abcabcbb,最长长度为3,即“abc”,或“bca”等等,返回3. public int lengthOfLongestSubstring(String s) { char[] chars = s.toCharArray(); HashSet HashSet = new HashSet(); int maxLength = 0;原创 2022-05-08 19:43:07 · 160 阅读 · 0 评论 -
链表有环(引申题:环在哪里)
public class Test { private static class ListNode { int value; ListNode next; } public static boolean hasCycle(ListNode head) { if (head == null || head.next == null) { return false; } ListN.原创 2022-03-10 00:08:23 · 97 阅读 · 0 评论 -
删除最外层的括号
这个也很简单,主要是在每次遍历到右括号的时候,从栈里pop()一个出来,如果此时栈为空,则说明找到了消解项。力扣 public String removeOuterParentheses(String s) { int start = 0; StringBuilder stringBuilder = new StringBuilder(); int len = s.length(); Stack stack = new Stac..原创 2022-02-23 19:23:15 · 148 阅读 · 0 评论 -
算法题:回文数
力扣 思路:用栈 public static boolean isPalindrome(int x) { if (x < 0) { return false; } if (x == 0) { return true; } //怎么取每位数字? String s = String.valueOf(x); int len =...原创 2022-02-23 14:21:39 · 146 阅读 · 0 评论 -
有效的括号
public boolean isValid(String s) { int len = s.length(); if (len % 2 != 0) { return false; } HashMap hashMap = new HashMap(); hashMap.put('{', '}'); hashMap.put('[', ']'); hashMap.put('('.原创 2022-02-23 11:10:25 · 338 阅读 · 0 评论 -
二叉树最近公共祖先
package Leetcode.ListNode;/** * @Author: YCKJ3803 * @Date: 2021/3/2 11:46 * @Description: */public class lowestCommonAncestor { private static class TreeNode { int value; TreeNode left; TreeNode right; } public s.原创 2021-03-02 21:39:33 · 248 阅读 · 0 评论 -
层序输出二叉树
package Leetcode;import java.util.ArrayList;import java.util.Arrays;import java.util.LinkedList;import java.util.Queue;/** * @Author: YCKJ3803 * @Date: 2021/2/3 13:50 * @Description: 层序打印二叉树。这是非常简单的一题。就是用队列!!!!! * 先从队列中取出一个,再往队列插入左右节点。 */...原创 2021-03-02 17:55:55 · 360 阅读 · 0 评论 -
字符串最长重复连续子串
比如字符串aaaabbbcddc,因为aaaa最长,返回4本题是面试遇到的真题,需要熟练手写原创 2021-02-23 15:46:50 · 674 阅读 · 0 评论 -
剑指offer 二维数组找目标值
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。规律:首先选取数组中右上角的数字。如果该数字等于要查找的数字,查找过程结束:如果该数字大于要查找的数字,剔除这个数字所在的列:如果该数字小于要查找的数字,剔除这个数字所在的行。也就是说如果要查找的数字不在数组的右上角,则每...原创 2019-12-06 14:19:30 · 214 阅读 · 0 评论 -
数据结构-归并排序
先粘贴下参考文献:https://www.cnblogs.com/chengxiao/p/6194356.html 写的很好原创 2019-11-08 15:03:29 · 120 阅读 · 0 评论 -
二分查找
二分查找是最简单的查找,本科阶段数据结构就应该学好的,现在来炒剩饭,重打基础。二分查找,必须是有序的,如果数组不是有序,则先排序,再查找。递归的二分查找是均分的,每次用中心点与目标值比较,再递归操作。递归的代码如下:package Collection;public class BinarySearch { /** * 使用递归的二分查找(递归的均分折半)...原创 2019-11-08 10:43:58 · 131 阅读 · 0 评论 -
堆排序详解
堆排序是必须要会手写的。原理如下:1.从最后一个非叶子结点开始,从左到右,从上到下,与父节点进行交换,构建大顶堆2.将堆顶元素(此时最大)与末尾元素交换,就获取了最大值了,再对剩下的n-1个节点也进行此类操作。就可以把最大值逐渐交换到最末端,实现大顶堆的升序排序。import java.util.Arrays;/** *1.构建一个大项堆。2.将堆顶与末尾交换。3,持续...原创 2019-11-07 10:34:53 · 195 阅读 · 0 评论 -
剑指offer-17 合并链表
2个链表,本来都是从小到大的顺序排列的,现在要求合并,合并后依然从小到大思路:先设定一个pointer指针,指向新链表的新节点。1.如果链表1为空,则新链表就是链表2,反之一样2.创建一个指针pointer,在子链表都不为空时,比较两个链表中节点值,pointer指向较小值,并遍历全部的链表3.如果其中任何一个链表比较结束,另一个还有,则将剩余链表直接接到新链表后面。注:不要用...原创 2019-10-10 17:40:20 · 135 阅读 · 0 评论 -
剑指offer-16 链表反转
法一(推荐)import java.util.Stack;public class Test05<sout> { public static class ListNode{ int Value; ListNode next; } //用栈 public static void zhan(ListNode roo...原创 2019-07-11 16:59:37 · 102 阅读 · 0 评论 -
快排-java
快排总结:分区方法(3个while),递归使用排序方法。 使用了分治法!!!package cn.com;import java.util.Arrays;public class QuickSort { public static void main(String[] args) { int arr[] = {8,3,2,5,4,7,6,1}; ...原创 2019-07-10 15:03:50 · 175 阅读 · 0 评论 -
树的总结
完全二叉树,满二叉树,最大(小)堆,二叉搜索树,平衡二叉树 ,B-树,B+树完全二叉树:二叉树如果有结点缺失,只能发生在右下角,可以只有左结点,没有右结点满二叉树:非叶子节点,都有两个子节点最大堆:首先得是完全二叉树,且父节点的值不小于子节点 二叉搜索树:父节点的值大于左子节点,且小于右子节点。用二叉搜索树查找,类似于二分查找,且比数组增删方便,比链表查找方便。平衡二叉树:最短...原创 2018-09-05 11:14:47 · 168 阅读 · 0 评论 -
五大常用算法之二:贪心算法
贪心算法1. 基本概念 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。(...原创 2018-04-28 20:19:38 · 291 阅读 · 0 评论 -
五大常用算法之一:回溯法
熟悉算法的朋友们都知道,我们经常使用五大算法思想,分别是1.贪心算法2.动态规划3.分治法4.回溯法5.分支限界法今天,我们先来总结一下:回溯法简介:回溯法的思想如下:每次都沿着一条路去寻找结果,如果发生了无解的情况,则返回到上一个分叉口,然后选择另一个选择。再向下走到尽头。回溯法适合复杂的,规模较大的问题,有着“通用解题方法”的美称。 常见的是八皇后问题,字符串排序问题(剑指offer真题)。下...原创 2018-04-27 22:23:35 · 634 阅读 · 0 评论 -
一句话回答数据结构
---------------------------------------------------------------------------------------------------------什么是时间复杂度?算法中频度f(n)的数量级。而频度是该算法被重复执行的次数。频度之和记作T(n)----------------------------------------...原创 2018-05-03 16:02:40 · 342 阅读 · 0 评论 -
五大常用算法之五:分支限界法
分支限界法:我们已知,回溯法的思想是深度优先搜索加剪枝,与之相对,分支限界法的思想是广度优先搜索加剪枝。 (搜索过程使用剪枝函数来为了避免无效的搜索。剪枝函数包括两类:1. 使用约束函数,剪去不满足约束条件的路径;2.使用限界函数,剪去不能得到最优解的路径。) 1. 分支限界法 – 广度优先搜素 1. 简单概述分支限界...转载 2018-05-01 22:07:58 · 1101 阅读 · 0 评论 -
五大常用算法之四:分治法
分治法和动态规划有点像,都是分解成子问题中科大的张署老师课件很清楚,摘录如下:1.什么是分治法当求解的问题较复杂或规模较大时,不能立刻得到原问题的解,但这些问题本身具有这样的特点,它可以分解为若干个与原问题性质相类似的子问题,而这些子问题较简单可方便得到它们的解,因此通过合并这些子问题的解就可得到原问题的解。2. 应用分治法的三个基本步骤①分解问题(divide):把...原创 2018-05-01 12:04:51 · 9482 阅读 · 0 评论 -
被考到的手写代码
1.一个n位数组,连续三个相加,求哪个位置的和最大?例:a[]={1,2,5,4,8,5,6,3,2},得到下标为3时值最大。和为4+8+5=172.手写二分查找,快排(这些都是最简单的了,肯定要会的)3.已知,每头母牛在生下来三年后,以后每年都可以生一头小牛,假设生的都是母牛。已知某农场第一年有一头牛,第四年有2头牛,问第十年有多少头牛?(写清思路即可)4. 输出一个n*m。n...原创 2018-08-14 11:54:36 · 1026 阅读 · 0 评论 -
剑指offer-21包含min函数的栈
题意题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。思路:构造一个辅助内存,再构造新的pop(弹出),push(压栈),min()方法。构造栈的标准格式为:Stack<Integer> data = new Stack<Integer>();而stack是vector的子类,它除了vector...原创 2019-07-24 17:04:13 · 91 阅读 · 0 评论 -
剑指offer-13 在o(1)内删除链表的某一节点
一个链表,需要对它进行删除操作,那么怎么在o(1)的时间复杂度内将其准确删除呢?其实,就是将某个node.value赋为0,其左右的指针打断再重连即可。关键是怎么重连。比如,我要删除i节点,那么让h直接指向j节点即可。但是,找到h节点,要遍历n次,不符合要求。所以,我们将j值复制到i处,再指向下下个点即可。具体步骤如下:1.判断head与要删除的点是否为null,如果为null...原创 2019-10-10 15:59:50 · 125 阅读 · 0 评论 -
剑指offer-10 二进制数字1的个数
输入一个int型数字,输出它作为二进制的1的个数。如9的二进制为1001,有2个1,则输出2。法一:因为int型有4个字节,一共32位,每次将输入右移1,并和1进行“与”操作。将结果累加,则为1的个数。public class Test10{ public static int numberofone(int n){ int result = 0; ...原创 2019-10-10 14:27:50 · 149 阅读 · 0 评论 -
剑指offer-两个栈实现-队列尾部插入,头部删除
大家都知道,队列是一个尾部(rear)插入,头部(front)删除的数据结构。本题要求,用两个栈,构造出一个队列出来。本题中,构造两个栈,stack1和stack2,1用来插入,2用来弹出。其中,栈1的插入很简单,函数体内部,直接用add方法即可。但是栈2的弹出,要考虑此时栈2是不是有值,如果2为空,1不空。则弹出1的值,add进2。如果此时2还没有值,则抛异常,如果有值,则pop出来。拓...原创 2019-09-06 21:35:06 · 578 阅读 · 0 评论 -
剑指offer-2替换空格为指定字符串
该题是剑指offer的基础题,输入一个字符串,里面有一些空格,将空格填写“%20”这三个字符。然后输出。下面是简单代码。public class Test0401{ public static void replaceblank(char[] string,int usedLength) { //统计空白字符数 int blanknum = 0...原创 2019-09-06 18:03:44 · 114 阅读 · 1 评论 -
剑指offer-输出字符串所有种类的排列组合
常规题,先校验长度,不符合则直接输出;符合则判断是否为最后一个字符,是则直接new对象输出,不是则交换begin和i位置的数字,再用递归输出。public class Test28{// 先校验 public static void permutation(char[] chars){ if (chars.length<1 || chars==null...原创 2019-09-03 09:21:37 · 338 阅读 · 0 评论 -
剑指offer-15 链表倒数第k个结点
题意题目描述输入一个链表,输出该链表中倒数第k个结点。背景头节点,有指针逐个指向下面的结点,就像下面的样子。这个链表的左边是头节点,右边是尾结点,从头到尾可以遍历,但反过来不行。思路:用两个指针,第一个指针走(k-1)步,到第k个结点,此时第二个指针在起点。然后,两个指针同时走,第一个指针到尾结点时,第二个指针恰好到第倒数第k个结点。p...原创 2019-07-25 15:25:20 · 87 阅读 · 0 评论 -
剑指offer-42翻转单词顺序-左旋转字符串
题意题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?...原创 2019-07-17 19:33:45 · 137 阅读 · 0 评论 -
LRU算法:设计一个过期策略,且set和get的时间复杂度是O(1)
这是一种最近最少使用的算法,使用的是linkedhashmap和双向链表。在o(1)时间内删除,设置。原创 2019-07-19 09:08:12 · 244 阅读 · 0 评论 -
五大常用算法之三:动态规划
动态规划:动态规划(Dynamic Programming,简称DP),需要分解出问题的子结构以及通过子结构重新构造最优解。动态规划不像回溯法,有套路可以套用,动态规划需要大量练习,才能掌握规律。一般思路:1.判断问题的子结构(也可看作状态),当具有最优子结构时,就可能使用动态规划。2.求解重叠子问题。一个递归算法不断地调用同一问题,递归可以转化为查表从而利用子问题的解。(注意与分...原创 2018-05-01 11:43:31 · 316 阅读 · 0 评论