数据结构与算法
文章平均质量分 51
数据结果与算法
Sirm23333
这个作者很懒,什么都没留下…
展开
-
(动态规划)LC 最长递增子序列
问题方法一:动态规划用一个数组dp[i]来表示以nums[i]结尾的最长子序列的长度(必须包含nums[i]),则有以下转移式:dp[i]=max{dp[j]∣0<=j<i且nums[i]>nums[j]}+1 dp[i] = max\{dp[j] | 0 <= j < i 且nums[i]>nums[j]\} + 1dp[i]=max{dp[j]∣0<=j<i且nums[i]>nums[j]}+1如果对所有的nums[j]都大于nums[i]原创 2021-03-04 11:12:49 · 382 阅读 · 1 评论 -
(动态规划)LC 零钱兑换
问题方法一:暴力法使用dfs或者bfs遍历所有的零钱组合,如果遍历结果和超过amount则结束本次遍历,找到和等于amount的最短路径。未剪枝的情况下会超时,下面是dfs的写法int minRs = Integer.MAX_VALUE; public int coinChange(int[] coins, int amount) { if(amount == 0) return 0; quickSort(coins,0,coins.l原创 2021-03-02 10:29:59 · 465 阅读 · 0 评论 -
(动态规划)LC 跳跃游戏
问题方法一:暴力法遍历数组,若下标i可以到达,则将从i往后的nums[i]步内的下标标记为可以到达。public boolean canJump(int[] nums) { int len = nums.length; boolean[] flag = new boolean[len]; flag[0] = true; for(int i = 0; i < len; i++){ if(flag[i]){原创 2021-02-23 21:13:29 · 522 阅读 · 0 评论 -
(搜索)寻找峰值
题目方法一:线性查找public int findPeakElement(int[] nums) { int len = nums.length; if(len == 1) return 0; int first, second, third ; for(int i = 0; i < len; i++){ first = i == 0 ? Integer.MIN_VALUE : num原创 2021-02-16 11:03:53 · 607 阅读 · 0 评论 -
(树)剑指offer 二叉树的最近公共祖先
题目方法一:递归p和q的最近公共节点r满足要求:r的左节点为p的祖先,右节点为q的祖先。或者r的右节点为q的祖先,左节点为p的祖先。因此构建一个递归函数,如果参数root的左右节点满足以上条件,这个root即为答案。否则,root如果是p的祖先则返回p,如果是q的祖先则返回q,再则返回nullpublic TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if(root == null)原创 2021-02-10 18:13:01 · 466 阅读 · 0 评论 -
(字符串)LC相交链表
题目方法一:遍历+哈希先遍历一遍链表A,将存在的节点存入哈希表中,再遍历链表B,第一个遇到已经存在的节点,即相交点public ListNode getIntersectionNode(ListNode headA, ListNode headB) { Set<ListNode> set = new HashSet<>(); ListNode a = headA , b = headB; while(a != null){原创 2021-02-07 12:46:21 · 369 阅读 · 0 评论 -
(字符串)LC递增的三元子序列
题目方法一:暴力法int len = nums.length; for(int i = 0; i < len; i++){ for(int j = i + 1; j < len; j++){ if(nums[i] < nums[j]){ for(int k = j + 1; k < len; k++){ if(nums[原创 2021-02-06 21:21:15 · 215 阅读 · 0 评论 -
(字符串)LC最长回文子串
题目方法一:暴力法直接遍历所有的子串,找到最长的回文子串public String longestPalindrome(String s) { int len = s.length(); char[] chars = s.toCharArray(); int max = Integer.MIN_VALUE , start = 0, end = 0; for(int i = 0; i < len; i++){原创 2021-02-06 20:39:12 · 334 阅读 · 0 评论 -
(数组)LC多数元素
题目方法一:哈希记录每个数出现的次数,如果超过数组数量的一半,则该数为结果public int majorityElement(int[] nums) { Map<Integer,Integer> map = new HashMap<>(); int len = nums.length , tmp = 0; for(int num : nums){ tmp = map.getOrDefault(num,0原创 2021-02-03 11:18:44 · 232 阅读 · 0 评论 -
(数组)LC缺失数字
题目方法一:排序先一步排序,若没有缺失的数字,则应该满足nums[i]=i 所以第一个nums[i]!=i的索引值即缺失值public int missingNumber(int[] nums) { Arrays.sort(nums); for(int i = 0; i < nums.length; i++){ if(i != nums[i]) return i; } ret原创 2021-02-02 20:15:10 · 232 阅读 · 0 评论 -
(数学)LC计数质数
题目方法一:枚举法对于质数的定义,仅能被1和其本身整除的大于1的整数为质数。判断一个整数n是否为质数,只需看n是否可以被2~sqrt(n)的任意整数整除,若存在这个整数,则为合数,否则为质数。public int countPrimes(int n) { int sum = 0; for(int i = 1; i < n; i++){ if( isPrimes(i)){ sum++;原创 2021-01-31 13:23:03 · 315 阅读 · 0 评论 -
(链表)LC环形链表
题目方法一:哈希表使用哈希表记录已经走过节点,如果遍历到已经访问的,则说明有环public boolean hasCycle(ListNode head) { Set<ListNode> visited = new HashSet<>(); ListNode tmp = head; while(tmp != null){ if(!visited.add(tmp)) retu原创 2021-01-21 19:22:34 · 375 阅读 · 0 评论 -
(链表)LC回文链表
题目方法一:使用栈记录遍历节点,再比较栈有先进后出的特点,遍历一遍链表,依次入栈;再遍历一遍链表并依次对栈进行弹栈操作并比较是否满足回文要求public boolean isPalindrome(ListNode head) { Stack<ListNode> stack = new Stack<>(); ListNode tmp = head; while(tmp != null){ stack.pu原创 2021-01-21 18:43:58 · 430 阅读 · 0 评论 -
(链表)LC合并两个有序链表
问题方法一:迭代拼接依次比较头结点,将小的节点加入到结果中 public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if(l1 == null) return l2; if(l2 == null) return l1; ListNode head = new ListNode() , tmp = head; while(l1 !=原创 2021-01-20 17:34:39 · 304 阅读 · 0 评论 -
(链表)LC删除链表中的节点
题目方法一未提供head节点,不要被固有思维影响,可以直接对node的val操作 public void deleteNode(ListNode node) { node.val = node.next.val; node.next = node.next.next; }原创 2021-01-20 15:42:17 · 211 阅读 · 0 评论 -
(字符串)LC最长公共前缀
题目方法一:纵向比较对字符串数组的每一个串按位依次比较,首次不同的位次,即最长前缀结束位置public String longestCommonPrefix(String[] strs) { if(strs.length == 0) return ""; int minLen = Integer.MAX_VALUE; for(String str : strs){ minLen = Math.min(mi原创 2021-01-20 14:33:40 · 365 阅读 · 0 评论 -
(字符串)LC实现 strStr()
题目方法一:子串直接比较失配时,haystack定位到下一个字符,needle定位到第一个字符,重新尝试匹配public int strStr(String haystack, String needle) { if(needle.length() == 0) return 0; char[] hChars = haystack.toCharArray(); char[] nChars = needle.toCharArray原创 2021-01-19 16:37:31 · 349 阅读 · 0 评论 -
(字符串)LC字符串中的第一个唯一字符
题目https://leetcode-cn.com/problems/first-unique-character-in-a-string/方法一:哈希表记录频次遍历一遍字符串,使用一个Map记录字母出现的频次,再一次遍历字符串,第一个出现频次为1的位置即答案。 public int firstUniqChar(String s) { Map<Character , Integer> map = new HashMap<>(); char[]原创 2021-01-15 11:01:02 · 284 阅读 · 0 评论 -
(算法)组合的递归算法Java实现过程
(算法)组合的递归算法Java实现过程一、无重复项的组合 对于无重复项的组合问题的递归思路可从以下几个步骤入手(以数组为例,如对其他元素排列,将元素编号放入数组即可): 以数组a[5]={1,2,3,4,5}为例,用C(5,num)表示从这5个数中选择num个数,求其所有的情况。 首先要明确,求一组数的组合问题,元素是没有位置要求的,即对于C(5,3)的求解{1,2,3}和{3,2原创 2018-02-03 23:18:11 · 12986 阅读 · 3 评论 -
(算法)DFS深度优先搜索—2016年蓝桥杯省赛java剪邮票
(算法)DFS深度优先搜索—2016年蓝桥杯省赛java剪邮票2016年蓝桥杯剪邮票原题:如【图1.jpg】, 有12张连在一起的12生肖的邮票。 现在你要从中剪下5张来,要求必须是连着的。 (仅仅连接一个角不算相连) 比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。请你计算,一共有多少种不同的剪取方法。请填写表示方案数目的整数。注意:你提交的应...原创 2018-03-30 18:16:11 · 10582 阅读 · 7 评论 -
(算法)排序—冒泡排序法Java实现
(算法)排序—冒泡排序法Java实现 对于冒泡排序法的理解思路不再过多解释,简单说就是多次循环遍历,把最大(小)值“沉到最底”以实现排序的效果。以下给出java程序:int数组排序:/** * 普通int数组从小到大排序 * @param arr */ public static void sort(int[] arr) { int length = arr.leng...原创 2018-03-27 17:35:20 · 14560 阅读 · 0 评论 -
(算法)java完成解析数学算式(计算器)一 —— 递归、正则直接遍历字符串解析
一、程序要求解析一般数学算式,实现简单的带括号的加减乘除运算。二、基本思路先从我们人的角度,考虑平时在计算一个式子的思路,任意假设一个的数学表达式-3.5*(4.5-(4+(-1-1/2)))1、计算最里面的括号(最后一个左括号)里的表达式(-1-1/2)2、计算除法1/2,将括号内容变为(-1-0.5)3、计算减法,得出括号结果-1.54、用该结果将括号替换,表达式变为-...原创 2018-07-23 20:58:22 · 14306 阅读 · 2 评论 -
(算法)java完成解析数学算式(计算器)二 —— 用数组解析
一、程序要求解析一般数学算式,实现简单的带括号的加减乘除运算。二、基本思路上一篇我以正常思考计算式子的角度考虑,介绍了直接递归遍历字符串解析数学四则运算式子,思路很好理解,但程序写出来较为难读。这里再用另一种方法,采用java的ArrayList集合(数组)来实现目的。这次我从易到难考虑:1)、单个数:如3,运算结果即这个数2)、加入加减后运算:如1+6-4,从左往右依...原创 2018-07-24 22:27:19 · 12631 阅读 · 0 评论 -
(算法)java完成解析数学算式(计算器)三 —— 用栈解析
一、程序要求解析一般数学算式,实现简单的带括号的加减乘除运算。二、基本思路前面两篇介绍了直接解析字符串和用数组容器辅助解析的两种方式,这次再介绍最常用的解析算法——解析后缀表达式(逆波兰表达式)。三、逆波兰表达式及其得到算法1、逆波兰表达式&amp;nbsp;也即后缀表达式,指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑...原创 2018-07-25 13:12:03 · 18897 阅读 · 3 评论 -
(算法)C语言模拟约瑟夫环问题
约瑟夫环问题描述m个人围坐一圈,每人持有一个数字,从第一个人开始从1报数,报到n(第一轮n任意给定)的人出圈,将n改为这个出圈的人所持有的数字,下个人开始从1报数,继续报到n的人出列;依次类推直到所有人出圈。C语言模拟该过程算法这里采用带有尾结点的循环单向链表存储玩家信息,p和pre两个指针分别指向报数结点和该结点的直接前驱,并同步移动n-1次,删除p指向的结点直至链表为空即可。具体代码...原创 2018-09-22 20:14:29 · 10624 阅读 · 0 评论 -
(算法)C语言实现数组元素的循环左移指定位数
问题描述对于一个任意长度为len的数组A,使其循环左移P个元素。如数组{1,2,3,4,5,6,7},左移3个元素即变为{4,5,6,7,1,2,3}。实现算法方法一对前3个元素完全转置,变为{3,2,1,4,5,6,7}对后4个元素完全转置,变为{3,2,1,7,6,5,4}对所有元素完全转置,变为{4,5,6,7,1,2,3}方法二直接观察法:题目要求的过程可以看为是按一定...原创 2018-09-22 22:06:11 · 17732 阅读 · 0 评论 -
(算法)C语言得到两个升序序列的中位数
问题描述一个长度为L (L>=1)的升序序列S,处在第⌈L/2⌉ 个位置的数称为S的中位数。例如,若序列S1=(11, 13, 15, 17, 19),则S1的中位数是15,两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若S2= (2, 4,6,8, 20),则S1和S2的中位数是11。现在有两个等长升序序列A和B,试设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列A...原创 2018-09-22 23:19:55 · 12008 阅读 · 4 评论 -
(算法)C语言实现查找一个序列的主元素
问题描述已知一个整数序列A=(a0,a1,…,an-1),其中0≤ai<n(0≤i<n)。若存在ap1=ap2=…=apm=x且m>n/2(0≤pk<n,1≤k≤m),则称x为A的主元素。例如A=(0,5,5,3,5,7,5,5),则5为主元素;又如A=(0,5,5,3,5,1,5,7),则A中没有主元素。假设A中的n个元素保存在一个一维数组中,请设计一个尽可能高效的算...原创 2018-09-22 23:34:20 · 15486 阅读 · 4 评论 -
(算法)通俗易懂的字符串匹配KMP算法及求next值算法
大多数据结构课本中,串涉及的内容即串的模式匹配,需要掌握的是朴素算法、KMP算法及next值的求法。在考研备考中,参考严奶奶的教材,我也是在关于求next值的算法中卡了一下午时间,感觉挺有意思的,把一些思考的结果整理出来,与大家一起探讨。以下的顺序为1、最基本的朴素算法2、优化的KMP算法3、应算法需要定义的next值4、手动写出较短串的next值的方法5、最难理解的、足足有5行的代码...原创 2018-10-06 00:23:54 · 155731 阅读 · 175 评论 -
(算法)ccf201312-4有趣的数,动态规划推导过程,c++参考例程
问题描述我们把一个数称为有趣的,当且仅当:它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次。所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前。最高位数字不为0。 因此,符合我们定义的最小的有趣的数是2013。除此以外,4位的有趣的数还有两个:2031和2301。 请计算恰好有n位的有趣的数的个数。由于答案可能非常大,只需要输出答案除以100000000...原创 2019-01-19 13:35:20 · 9487 阅读 · 6 评论 -
2016年蓝桥杯国赛JavaB组碱基问题
问题描述碱基生物学家正在对n个物种进行研究。其中第i个物种的DNA序列为s[i],其中的第j个碱基为s[i][j],碱基一定是A、T、G、C之一。生物学家想找到这些生物中一部分生物的一些共性,他们现在关注那些至少在m个生物中出现的长度为k的连续碱基序列。准确的说,科学家关心的序列用2m元组(i1,p1,i2,p2…im,pm)表示,满足:1<=i1<i2<…<i...原创 2019-05-18 16:27:23 · 807 阅读 · 0 评论 -
(算法)全排列的递归算法Java实现过程
(算法)全排列的递归算法Java实现过程一、无重复项的全排列全排列的数学定义就不再过多解释,考虑递归算法的实现可从下面几点入手(以数组为例,如对其他元素排列,将元素编号放入数组即可):1、一个数的全排列,如排列{1},就是这个数本身这一种情况2、两个数的全排列,如排列{1,2}:第一步:将{1}放在第零个位置,剩下的{2}进行一个数的全排列,结果为{1,2}第二原创 2018-02-02 22:43:24 · 16794 阅读 · 3 评论