![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
stars77
这个作者很懒,什么都没留下…
展开
-
剑指offer(java实现)——数值的整数次方
题目写一个Power函数,不能调用函数库,同时不需要考虑大数问题。思路这里只介绍最合适的思路,就是采用递归的方法,比如指数为8,8递归到4,4递归到2,要是奇数,就是最后乘一个自己本身代码public class T16 { public static double pow(double base,Integer expnent){ if(expnent == ...原创 2020-02-08 13:13:12 · 213 阅读 · 0 评论 -
剑指offer(java实现)——二进制中1的个数
题目输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路方法一是最佳的,比较巧妙地,把目标数减一然后和目标数去与,目标数有几个一就会与几次,因为与运算会把右边的1变成0.方法二次之,将目标数和1与,然后把1左移一位,反复左移,就能得出有几个1.方法三没有考虑负数的情况,所以不予推荐,思路就是把目标数和1与运算。然后左移一位,但如果是负数的话,左移一位就会补个1,这样就会成...原创 2020-02-06 15:11:16 · 190 阅读 · 0 评论 -
剑指Offer(Java实现):剪绳子
题目给你一根长度为n绳子,请把绳子剪成m段(m、n都是整数,n>1并且m>1)。每段的绳子的长度记为k[0]、k[1]、……、k[m]。k[0] * k[1]*…*k[m]可能的最大乘积是多少?例如当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到最大的乘积18。思路1.动态规划方法四个特点:①求一个问题的最优解;②整体的问题的最优解是依赖于各个子问题的最...原创 2020-02-05 20:00:28 · 279 阅读 · 0 评论 -
归并排序-自底向上排序中的一点疑问理解
具体思想不介绍了,直入主题,代码如下: public static void sort1(Comparable[] a){ //进行lgN次两两归并 int N = a.length; aux = new Comparable[N]; for(int sz = 1; sz < N; sz = sz*2)//sz子数组大小 ...原创 2020-02-05 14:50:46 · 295 阅读 · 0 评论 -
剑指Offer(Java实现):机器人的运动范围
题目地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7=18。但是,它不能进入方格(35,38),因为3+5+3+8=19。请问该机器人能够达到多少个格子?思路用一个同样大小的vector初始化为0。判断当前位...原创 2020-02-02 23:06:24 · 275 阅读 · 0 评论 -
剑指Offer(Java实现):数组中的重复数字(二分实现)
题目一个数组,有重复数字,在不破坏数组的前提下,找到数组的任意一个重复数字思路一个数组比如有8个数字,取中间值4,按道理是比4小的数字有四个,如果比4小的数字或者比4大的数字大于4个,那重复的数字一定是在前四个或者后四个,取一半以后,再把前4或者后4分为一半,和2比较,直到找到重复的数字。代码public class T03 { public static int getnums...原创 2020-01-20 19:32:00 · 268 阅读 · 0 评论 -
剑指Offer(Java实现):矩阵中的路径
题目请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串”bcced”的路径,但是矩阵中不包含”abcb”路径,因为字符串的第一个字符b占据了矩...原创 2020-01-20 19:27:06 · 256 阅读 · 0 评论 -
剑指Offer(Java实现):旋转数组的最小数字
题目把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。解题用两个指针,一个指向第一个,一个指向最后一个,中间的数字大于第一个就让第一个的指针指到中间的数字(这个时候数组就剩一半了),中间的小于最后一个就让最后一个指向中间的数字。最小的...原创 2020-01-18 23:38:47 · 209 阅读 · 0 评论 -
剑指Offer(Java实现):用两个栈实现队列
题目写一个函数,输⼊入n,求斐波那契数列的第n项 (一只⻘青蛙一次可以跳上1级台阶,也可以跳上2级。求该⻘青蛙跳上一个n级台阶总共有多少种跳法)解题从下往上计算,首先根据f(0)和f(1)算出f(2),再根据f(1)和f(2)算出f(3)…以此类推就可以算出第n项了。时间复杂度为O(n).代码private static long fibonaci(int n){ long[] a =...原创 2019-12-28 21:01:31 · 198 阅读 · 0 评论 -
剑指Offer(Java实现):用两个栈实现队列
题目用两个栈来实现一个队列,完成队列的Push和Pop操作。解题两个“先进后出”实现一个“先进先出”,两个栈,一个为入队栈stack1,一个为出队栈stack2,当stack2为空时,把stack1中的元素逐个压入stack2,此时stack2顶端元素就是队列头元素,可以直接弹出;当stack2不为空时,它的顶端元素可以直接弹出。再插入一个新的元素,还是压入stack1,但是要考虑辅助栈中还...原创 2019-12-26 23:36:03 · 197 阅读 · 0 评论 -
剑指Offer(Java实现):二叉树的下一个结点
题目给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。解题分两种情况:1.如果有右孩子,如果有,中继下一个节点是,右子树的最左边的节点2.如果没有左孩子,找父节点,如果是父节点的左孩子,父节点就是下一个代码/** * Definition for a binary tree node. * pub...原创 2019-12-26 00:15:48 · 167 阅读 · 0 评论 -
剑指Offer(Java实现):重建二叉树
题目输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不包含重复的数字。例如输入前序遍历序列{1, 2, 4, 7, 3, 5, 6, 8}和中序遍历序列{4, 7, 2, 1,5, 3, 8, 6},则重建出二叉树并输出它的头结点。解题1、 前序遍历序列中的第一个元素为根节点2、找到该根节点在中序遍历序列中的位置,左侧即为左树的遍历序列,右...原创 2019-12-24 23:09:49 · 174 阅读 · 0 评论 -
剑指Offer(Java实现):从头到尾打印链表
题目输⼊入⼀一个链表的头节点,从尾到头打印每个节点的值解题申请两个指针,第一个指针叫pre,最初是指向null的。第二个指针cur指向head,然后不断遍历cur。每次迭代到cur,都将cur的next指向pre,然后pre和cur前进一位。都迭代完了(cur变成null了),pre就是最后一个节点了。复杂度分析时间复杂度:O(n),假设 n 是列表的长度,时间复杂度是 O(n)。空...原创 2019-12-18 21:50:59 · 221 阅读 · 0 评论 -
剑指Offer(Java实现):替换空格
题目请实现一个函数,把字符串中的每个空格替换成"%20"。例例如输入"We arehappy",则输出"We%20are%20happy"解题先遍历一遍计算空格数量,然后扩展字符串长度,因为每个空格要替换三个字符,所以扩展的长度是空格数*2加上原来的字符串长度,准备两个指针,front和rear一前一后,前面的指向原始字符串的末尾,后面那个指向替换后的字符串的末尾。从前往后替换,前面的字符...原创 2019-12-18 21:45:55 · 258 阅读 · 0 评论 -
剑指Offer(Java实现):二维数组的查找
题目在一个二维数组中,每一⾏都按照从左到右递增的顺序排序,每⼀列都按照从上到下递增的顺序排序。请完成⼀个函数,输⼊这样的⼀个⼆维数组和⼀个整数,判断数组中是否含有该整数。题解具体思路就是选取右上角的数字比较,如果该数字等于要查找的数字,则查找过程结束;如果该数字大于要查找的数字,则排除数字所在列;如果该数字小于要查找的数字,则排除这个数字所在的行。复杂度分析这里我还不太会分析这个思路...原创 2019-12-17 22:16:59 · 187 阅读 · 0 评论 -
剑指Offer(Java实现):数组中重复的数字
题目在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},那么对应的输出是重复的数字2或者3。题解这里用letcode287号题的解题思路,没有用书上的解题思路,具体思路是迭代数组并将每个元素插入 seen 中...原创 2019-12-16 23:12:16 · 197 阅读 · 0 评论 -
数据结构——红黑树
什么是红黑树?了解红黑树之前可以先了解2-3树,2-3树满足二分搜索树的基本性质,节点可以存放一个元素或者两个元素每个节点可以有两个孩子或者三个孩子,三节点中间节点大于左边的值(b),小于右边的值(c)。2-3树是一棵绝对平衡的树。...原创 2019-12-05 11:35:44 · 170 阅读 · 0 评论 -
线段树
线段树什么是线段树?线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。而未优化的空间复杂度为2N,实际应用时一般还要开4N的数组以免越界,因此有时需要离散化让空间压缩。如果区间有n个元素,数组表示需要有多少个节点?需要4n个的空间我们的线段树...原创 2019-11-04 20:09:37 · 170 阅读 · 0 评论