有趣的算法
算法练习题
北海道恋人
某不知名大学在校学生
展开
-
通用方式解决根据二叉树遍历重建二叉树问题
通用方式解决根据二叉树遍历重建二叉树问题重做LeetCode题目的时候,发现两道题目非常类似,但之前却用了两种写法差别比较大的解法。感觉可以合并为同一种方式进行解决,于是找出了如下的通用方式解决这两个问题题目一:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]题目二:根据一棵树的中序遍历与后序遍历构造二叉树原创 2021-04-06 21:35:24 · 96 阅读 · 0 评论 -
数据结构-单调栈 leetcode 下一个更大的数
数据结构-单调栈 leetcode 下一个更大的数2由leetcode题目引入:刷题时看到这道题,第一反应使用循环数组暴力解题了,附上代码暴力解题代码public static int[] nextGreaterElements(int[] nums) { int[] res = new int[nums.length]; Arrays.fill(res,-1); int j; int index; for (int原创 2021-03-06 11:35:07 · 225 阅读 · 0 评论 -
第三届传智杯程序设计赛B组题解Java版
第三届传智杯程序设计赛B组题解Java版文章目录第三届传智杯程序设计赛B组题解Java版A - 课程报名B - 期末考试成绩C - 志愿者D - 终端E - 运气A - 课程报名import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt原创 2020-12-28 18:35:17 · 2517 阅读 · 4 评论 -
链表成环问题
每日一道算法题(Day01,无特殊情况每日打卡)链表成环问题问题概述:判断一个单链表是否有环问题本质:追及问题package algorithm;import java.util.Iterator;public class LinkList<T> implements Iterable<T>{ //记录链表头节点 private Node head; //记录链表长度 private int len; //创建一个内部类,存原创 2020-06-08 22:48:34 · 578 阅读 · 0 评论 -
获取栈中最小值的最小栈问题
每日一道算法题最小栈问题问题概述:获取一个栈中最小的元素问题本质:栈的灵活运用思路:对于一个栈,采用标记位的方法记录栈中的最小值。如果新入栈的元素小于当前栈中保存的最小值,就将栈的最小值替换为新入栈的元素。注意需要考虑出栈的情况,如果当前最小值出栈,那么当前最小值的前一个最小值应该为当前栈的最小值。故:需要将栈的最小值的标记位修改为一个辅助栈,存储栈中的所有最小值。例图分析:package algorithm;import java.util.Iterator;public cl原创 2020-06-09 20:52:55 · 434 阅读 · 1 评论 -
如何最优求解最大公约数
每日一道算法题最大公约数问题概述:求两数的最大公约数,要求时间复杂度尽可能小问题本质:经典算法使用、灵活位运算思路:利用辗转相除法利用更相减损术针对两个方法缺点进行改进融合使用位运算提高计算机处理性能package algorithm;/** * 最大公约数算法 * 1、辗转相除法 * 2、更相减损术 * 3、二者结合 */public class CommonDivisor { public static void main(String[] args)原创 2020-06-10 16:04:03 · 328 阅读 · 0 评论 -
一行代码解决2的整数次幂
每日一道算法题一行代码解决2的整数次幂问题概述:给定一个数number,确定该数是否为2的整数次幂问题本质:计算机存储二进制格式、&运算的运用思路:2^1=> 102^2=> 1002^3=> 1000…2^n=> 100…000那么2^1-1=> 12^2-1=> 11…2^n=> 111…111package algorithm;public class Pow { public static voi原创 2020-06-11 18:24:08 · 550 阅读 · 0 评论 -
最大相邻差
今日小算法最大相邻差问题概述:最大相邻差求一无序数组排序后两个数相邻的最大距离例:原数组:1 3 2 4 7 6 2排序后:1 2 2 3 4 6 7相邻差:1 0 1 1 2 1最大相邻差:2思路:利用计数排序或桶排序的思路计数排序:当两个下标之间的0的个数最多时,这两个数的差值就是最大相邻差如例:计数排序后结果为:可以发现a[4]与a[6]之间0最多,最大相邻差就为6-4=2桶排序:桶排序则解决了当元素差距较大但数量却不多时计数排序创建数组过多的问题例:原数组:1原创 2020-06-15 18:36:19 · 301 阅读 · 0 评论 -
使用栈完成队列功能
今日小算法问题概述:使用栈完成队列先进先出的功能思路:使用两个栈,入栈使用A栈,出栈时将A栈中所有元素全部放入B栈中之后再从B栈中取元素就OKpackage algorithm;public class StackQueue { MyStack stackA = new MyStack(); MyStack stackB = new MyStack(); public static void main(String[] args) { StackQueu原创 2020-06-16 20:56:00 · 113 阅读 · 0 评论 -
给定一个数寻找全排列的下一个数
今日小算法寻找全排列的下一个数问题概述:给定一个数,要求出该数全排列后大于该数的最小的数思路:一个数最大为所有数字逆序一个数最小为所有数字顺序利用这个规则,将整个数分为逆序区和非逆序区,进行数据位置交换,最后将逆序区有序即可,详细参考代码package algorithm;import java.util.Arrays;/** * 全排列问题: * 给定一个数,要求出该数全排列后大于该数的最小的数 * 例:123 运算结果是132 * 主要分三步: * 1、寻找逆序区前一个原创 2020-06-17 23:46:08 · 213 阅读 · 0 评论 -
删除k个数后得到尽可能小的数
今日小算法问题概述:删除K位数字后,使剩余数字最小例:2634 删除1位数后得到最小数为234删除2位数后得到最小数为23…思路:利用贪心算法思想获取局部最优解,最后得到整体最优解每删除1位数就获得当前的最小值,然后在当前最小值基础上继续进行删除package algorithm;import java.util.Arrays;/** * 删除K位数字后,使剩余数字最小 * 思路:删除高位数字、删除大数 * 从高位遍历数字寻找下一位小于本位的数字删除 * 这样可以使下一位原创 2020-06-18 12:37:21 · 330 阅读 · 0 评论 -
老生常谈的大数加法
大数加法** 问题概述:**两个极大的数进行加法求和思路:根据列竖式方式解决问题,一位一位的满十进一package algorithm;import java.util.Arrays;/** * 大数加法 */public class BigNumAddition { public static void main(String[] args) { String num1 = "123"; String num2 = "98";原创 2020-07-05 15:59:04 · 2932 阅读 · 0 评论 -
动态规划经典例题-国王的金矿问题
金矿问题问题概述:有一位国王拥有5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人人数也不同。例如有的金矿储量是500kg黄金,需 要5个工人来挖掘;有的金矿储量是200kg黄金,需要3个工人来挖 掘…… 如果参与挖矿的工人的总数是10。每座金矿要么全挖,要么不挖,不能 派出一半人挖取一半的金矿。要求用程序求出,要想得到尽可能多的黄 金,应该选择挖取哪几座金矿?什么是动态规划:动态规划:将复杂问题简化为规模较小的子问题,再从简单的子问题自底向上一步一步递推,最终得到复杂问题的最优解思路:利用原创 2020-07-06 17:52:00 · 1683 阅读 · 0 评论