算法与数据结构
_SpringBoot
这个作者很懒,什么都没留下…
展开
-
盛最多水的容器-Leetcode11
贪心算法之力扣第十一题:描述:给定n个非负整数a1,a2,...,an,每个数代表坐标中的一个点(i,ai) 。在坐标内画n条垂直线,垂直线i的两个端点分别为(i,ai) 和 (i, 0)。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且n的值至少为 2。示例:输入: [1,8,6,2,5,4,8,3,7]输出: 49代码:public class Solution { public i...原创 2020-09-24 23:17:48 · 145 阅读 · 0 评论 -
寻找两个正序数组的中位数-Leetcode04
如题:给定两个大小为 m 和 n 的正序(从小到大)数组nums1 和nums2。请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为O(log(m + n))。你可以假设nums1和nums2不会同时为空。示例1:nums1 = [1, 3]nums2 = [2]则中位数是 2.0示例2:nums1 = [1, 2]nums2 = [3, 4]则中位数是 (2 + 3)/2 = 2.5代码:...原创 2020-07-08 22:15:37 · 357 阅读 · 0 评论 -
无重复字符的最长子串-Leetcode03
给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。示例1:输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例3:输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是"wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"是一个子序列,不是...原创 2020-07-04 17:04:55 · 213 阅读 · 0 评论 -
两数相加-Leetcode02
题目是Leetcode第二题,难度中等题目:给出两个非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0开头。实例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807代码如...原创 2020-07-03 12:20:32 · 230 阅读 · 0 评论 -
C语言单链表
链表是通过一组任意的存储单元来存储线性表中的数据元素定义节点如下:(语言是标准C语言)typedef struct node{ ElemeteType data;//数据域 struct node next;//指针域}LNode,*LinkList;单链表的基本操作单链表的插入操作void InsList(LinkList L,int i,...原创 2020-03-23 21:41:24 · 307 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
剑指offer第21题题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路一:类似于插入排序的思想,对于数组,遇见奇数就将当前的奇数往前移动,直到往前移动的过程中,遇到奇数时停止移动,时间复杂度:O(n^2)public class Solution { ...原创 2020-02-17 16:12:58 · 141 阅读 · 0 评论 -
顺时针打印矩阵
还清楚的记得这道题是我美团二面手撕算法的那道题,唉剑指offer第29题题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.上图就是顺时针打印的顺序,我们只要模...原创 2020-02-15 18:32:29 · 153 阅读 · 0 评论 -
数值的整数次方
剑指offer第十六道题给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0思路:这道题相对简单,判断个幂的正负就行,代码如下:public class Solution { public double Power(double base,double exponent){ ...原创 2020-02-14 22:20:34 · 129 阅读 · 0 评论 -
二进制中1的个数
这道题是剑指offer第15道题题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。第一种思路:我们通过对这个数的二进制每一位和1进行“与运算”,如果为1,那么就累加1的个数如对于十进制5:二进制为101,我们通过其每个位与二进制数1,10,100进行与运算,那么也就是对于二进制1,不断地进行左移,就可以出现1,10,100,1000等的数。但是存在一个问题,我们不知...原创 2020-02-14 15:06:00 · 191 阅读 · 0 评论 -
旋转数组的最小数字
剑指offer第11道题:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。刚开始读题,一遍都没读懂(我是小白,才开始入门),再读一遍,题目的目的不就是求出一个在一...原创 2020-02-13 14:44:33 · 167 阅读 · 0 评论 -
两数之和-Leecode01
给定一个整数数组 nums和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]来源:力扣(...原创 2020-02-04 12:47:08 · 139 阅读 · 0 评论 -
在排序数组中查找数字
剑指offer第53题题目:数字在排序数组中出现的次数统计一个数字在排序数组中出现的次数,例如:输入排序书序{1、2、3、3、3、3、3、4、5}和数字3,由于3在这个数组中出现了4次,因此输出4发现这个题用到了二分查找的思想,因为数组是排序的,所以我们可以查找出第一次和最后一次出现k的位置,然后两个位置差+1就是出现的次数了贴代码:public class Main { ...原创 2019-10-01 16:12:25 · 221 阅读 · 0 评论 -
从上到下打印二叉树
剑指offer第32题:用队列来实现打印二叉树,从上到下按行来打印贴代码:(有注释)public class Main { /** * 一边打印一边入队 * @param root */ public void PrintTopBottom(Node root){ if(root==null){ ...原创 2019-09-24 21:25:48 · 120 阅读 · 0 评论 -
树的子结构
剑指offer第26题代码看不懂的话可以看我注释,如果还是没有的话,直接去看剑指offer。贴代码:public class Main { Node root; boolean HashSubtree(Node root1,Node root2){ boolean result=false; /** * 每次都是从...原创 2019-09-24 19:46:32 · 116 阅读 · 0 评论 -
合并两个排序的链表
剑指offer,我要把所有的链表问题做一遍其实这里合并链表和和并数组差不多吧,我感觉假如说是从小往大排序,那么两个节点谁小,待插入指针就指向哪个节点,这里就是用MergeHead来指的,谁小,谁就作为MergeHead的next。public class Main { Node Merge(Node head1,Node head2){ if(head1=...原创 2019-09-23 16:32:55 · 143 阅读 · 0 评论 -
删除链表的节点
剑指offer第18题,说要用O(1)的时间复杂度来删除节点,一下子想不来,看了书才笨笨的想到如果要删除一个节点,我们势必要找到它的前一个节点,这样就可以删除了,不过,找到前一个节点后,我们的时间复杂度就是O(n)了,所以可以这样想,我们要删除这个节点,不妨用下一个节点的值把待删的值覆盖掉(意思就是把待删节点下一个节点值赋给待删节点,然后删除掉待删节点),这样待删节点就保存了下一个节点的值,所...原创 2019-09-23 16:11:49 · 267 阅读 · 0 评论 -
二叉树的下一个节点
抄自剑指offeroffer由于步骤要分很多中情况,我就把照片贴这里(懒)注意(这个二叉树可以找父节点,就是parent节点,和一般二叉树稍微有区别)贴代码:public class Main { Node root; Node GetNext(Node root){ if(root==null){ return n...原创 2019-09-23 15:32:43 · 108 阅读 · 0 评论 -
数组中重复的数组
剑指offer面试题3类似于hash算法,自己画画就明白了public class Main { public static void getRepeatNumber(int array[]){ if(array.length==0){ return; } for(int i=0;i<ar...原创 2019-09-22 01:00:31 · 130 阅读 · 0 评论 -
二维数组中查找
这就是剑指offer那道题比如我们查找数字7,步骤如下,我就不打上去了,也好理解着,就是一步步二维的缩小查找的范围贴代码(已测试正确):public class Main { /** * @param array 传入的数组 * @param rows 数组的行 * @param columns 数组的列 * @param ke...原创 2019-09-21 23:32:31 · 137 阅读 · 0 评论 -
实现Singleton模式
单例模式的两种实现方式1、双端检测通过volatile来保证线程之间变量的可见性 用两个if判断,第一个判断来减少synchronized导致的低效率//双重检查/** * Double-Check双重检查,判断if(singleton==null) * 避免反复进行方法同步 * 线程安全;延迟加载;效率较高 * */public class Singleton05 {...原创 2019-09-21 22:49:05 · 142 阅读 · 0 评论 -
顺序栈和链栈
栈:(stack)是限定仅在表尾进行插入或删除操作的线性表。(用自己形象的话说,可以把栈比作一个没有盖的桶,栈底就是桶底,而栈顶就是你给桶里放的烧饼(一层只能放一个烧饼),最上面的那个烧饼就是栈顶)。当然你想取出桶底的烧饼,就必须一一的拿出最外面的烧饼,所以栈又称为后进先出(Last In First Out,LIFO)的线性表。一.顺序栈顺序栈就是利用顺序存储结构实现的栈,就是利用一...原创 2018-12-23 16:50:53 · 746 阅读 · 0 评论 -
java实现单向链表与链栈
准备复习数据结构,从链表开始,想着csdn看看别人是咋写的,一搜一大堆,每个人写的都不一样,当然我可能写的也很奇葩,我就是根据我学C语言的时候写的一、单向链表1、定义链表节点public class Node { public int data;//数据域 public Node next;//指针域 public Node(int data){ ...原创 2019-07-17 14:26:42 · 249 阅读 · 0 评论 -
冒泡、选择、插入、快排、归并、希尔排序
冒泡排序最差时间分析:O(n^2)平均时间复杂度:O(n^2)public class BubbleSort_ { public static void sort(int array[]){ int i,j; for(i=0;i<array.length-1;i++){ for(j=i;j<array.le...原创 2019-09-05 10:43:25 · 171 阅读 · 0 评论 -
背包问题
背包问题解决:代码:public class KnapsackProblem { public static void main(String[] args) { int []w={1,4,3};//物品的重量 int []val={1500,3000,2000};//物品的价值 这里的val[i],就是前面的v[i] ...原创 2019-09-13 15:56:08 · 202 阅读 · 0 评论 -
贪心算法
可以通过穷举来找代码:public class GreedyAlgorithm { public static void main(String[] args) { //创建广播电台,放入到Map HashMap<String,HashSet<String>> broadcasts = new ...原创 2019-09-14 10:53:50 · 126 阅读 · 0 评论 -
二叉树的镜像
二叉树的镜像:所谓镜像就是从树中间劈开后,两半一样,这就是镜像二叉树代码实现的时候:从上面的最大的节点向下开始,先交换root下面的两个大的左右子树,大体位置交换之后,在递归交换每一个小的子树,直到交换叶子节点,就完成了看完后可以感受一下一篇:对称的二叉树代码:在交换两个节点,采用就是交换两个变量的值那样交换,通过中间变量来交换/** * 二叉树的镜像 */public...原创 2019-09-14 20:01:44 · 149 阅读 · 0 评论 -
对称的二叉树
一般都会让我们去判断二叉树是否是对称的?看了我的上一篇博客 二叉树的镜像感觉和这篇博客像像的,其实也就是像像的对称二叉树:两边相同等的位置的节点的值一样,说白了就是从主树干折过去完全覆盖代码:public class Main { public boolean isSymmetrical(TreeNode root){ //通过重载,来将树分开,...原创 2019-09-14 20:44:49 · 393 阅读 · 0 评论 -
二叉树的深度
二叉树的深度:肯定有好多深度,然后比较得出最深的那一条,按照递归思想也就是两条深度,左子树和右子树/** * 二叉树的深度 */public class Main { public static int TreeDepth(TreeNode root) { if (root == null) { return 0; } ...原创 2019-09-15 08:24:03 · 174 阅读 · 0 评论 -
链表中倒数第K个节点
定义两个指针,两个指针的间距设置好为K-1后,两个指针同时跑,当后面的指针指到链表尾部的时候,前面的指针就到了倒数第K个节点public class Solution { public Node FindKthToTall(Node head,int k){ Node phead=head;//后面的指针 Node temp=head;...原创 2019-09-15 08:48:31 · 109 阅读 · 0 评论 -
减绳子
没错就是剑指offer那倒题,尽量让这个数拆成2,3,这种因子乘积最大。余三有两种可能,余1,余2,余1的话不如让它余个4(2*2),这个题就结束了题目:给你一根长度为n的绳子,请把绳子剪成m段,记每段绳子长度为k[0],k[1]...k[m-1],求k[0]k[1]...k[m-1]的最大值。已知绳子长度n为整数,m>1(至少要剪一刀,不能不剪),k[0],k[1]...k[m-1...原创 2019-09-15 09:28:58 · 257 阅读 · 0 评论 -
连续子数组的最大和
就是剑指offer那道题应该读题了吧,我就不把题目敲上去了,连续子数组最大和,数组元素可正可负平安产险现场笔试的时候就遇到这个题:平安产险笔试+一面使用动态规划来解决:这样想:求连续子数组之和,把这个问题放小,如果只有两个数组呢,是不是看加了第二个数组和没加第二个数组之间,哪个值比较大,如果值增加,那就加,如果值减小就不要加,放大:通过一个函数表示出前一次子数组之和和前一次数组之和...原创 2019-09-15 10:06:51 · 120 阅读 · 0 评论 -
用两个栈实现队列
赶紧来复习一下算法,明天面试手撕算法的话,感觉要凉凉了这就是剑指offer那道题,没错用两个栈实现队列,在这之前你也一定了解过什么是队列吧?我就不再说队列了可以用一个入栈作为入队列栈,用另外一个栈作为出队列栈public class TwoStackGenerateQueue { static Stack<Integer> instack=new Stack&...原创 2019-09-15 20:08:58 · 136 阅读 · 0 评论 -
链表中环的口节点
就是剑指offer辣道题没错如果一个链表中包含换环,如何找出环的入口节点?像求链表的倒数第k个节点一样,我们采用两个一前一后的指针来找位置,同样,我们采用两个指针,如果环中有4个节点,那么就让前面的节点先走4步,后走的节点一会儿肯定会和先走的节点相遇,因为是通过一个环,肯定会在入口处(也就是出口处)遇到,但是问题是:我们不知道这个节点的位置,也不知道环中节点的数目,所以我们:1、首先判...原创 2019-09-16 10:10:30 · 126 阅读 · 0 评论 -
反转链表
又想了遍反转链表,我感觉我写的很详细了,你一定能看懂的,注释在代码中。public class Main { Node getReverseList(Node head){ //如果链表为空或只有一个节点,不需要反转,直接返回就行 if(head==null||head.next==null){ return head; ...原创 2019-09-18 21:01:49 · 96 阅读 · 0 评论 -
从头到尾打印链表
(递归实现)package pers.chao.niuke.ch1.p1._8从尾到头打印链表;public class Main { Node head; public static void print(Node head){ if(head==null){ return ; }else{ ...原创 2019-09-18 21:27:49 · 104 阅读 · 0 评论 -
两个链表的第一个公共节点
就是剑指offer面试题52,两个链表的第一个公共节点所谓公共节点大概就是这样了,因为一个链表只能有一个后继如果两个节点恰好在末尾,如果两个链表的节点在第一个位置,那就是一条链表了对两个链表从头到尾进行遍历都没有相同的位置,那么肯定就没有公共的节点看书上说,也可以用两个辅助栈来实现:把第一个链表放进栈里把第二个链表放进栈里然后再弹出(也就是从两个链表的结尾开始...原创 2019-09-21 17:44:33 · 122 阅读 · 0 评论