
算法
文章平均质量分 74
;
谬了个大也
我没有bug
展开
-
leetcode刷题(四)--- 贪心思想(go实现)
leetcode刷题类型(四)--- 贪心思想 保证每次操作都是局部最优的,并且最后得到的结果是全局最优的。原创 2022-01-27 21:23:38 · 588 阅读 · 0 评论 -
leetcode刷题(三)--- 二分查找(go实现)
leetcode刷题类型(二)--- 二分查找及其变种 二分查找及其相关变形题目常用在有序数组中找指定值,通过将区间对半可以将时间复杂度降到O(log~2~N)。原创 2022-01-25 02:36:50 · 325 阅读 · 0 评论 -
leetcode刷题(二)--- 排序(go实现)
leetcode刷题类型(二)— 排序类型1、求解 Kth Element 问题,也就是第 K 个元素的问题2、求解 TopK Elements 问题,也就是 K 个最小元素的问题解法: 1、快速排序 2、最小堆原创 2022-01-23 15:30:48 · 755 阅读 · 0 评论 -
leetcode刷题(一) --- 双指针(go实现)
leetcode刷题类型(一)--- 双指针类型 在排好序的数组或是链表中,两个指针朝着左右方向移动(双指针分为同向双指针和异向双指针),找一些组合满足某种限制条件。原创 2022-01-20 22:47:29 · 403 阅读 · 0 评论 -
【剑指offer】栈的压入、弹出序列
题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路:栈的弹出:必须遵守先进后出规则,且可以在序列压入栈途中进行弹出 ...转载 2019-05-27 17:48:25 · 143 阅读 · 0 评论 -
【剑指offer】合并两个排序的链表
题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路:用两个指针分别指向链表的第一个结点,比较这两个结点的大小将小的结点加入到合并后的链表中,并向后移动当前指针两个链表中,若有一个链表先扫描完,就将对应的另一个链表的剩余部分直接添加到合并后的链表中。实现:递归法:public ListNode Merge(ListNode li...原创 2019-05-26 13:03:49 · 132 阅读 · 0 评论 -
【剑指offer】链表中倒数第k个结点
题目描述:输入一个链表,输出该链表中倒数第k个结点。思路:用两个指针构造一把长度为k的“尺子”,初始时两个指针都指向头结点再将第一个指针指向第k个结点。然后两个指针同时往后移动当第一个指针到达末尾的时候,第二个指针所在位置即为倒数第k个结点(注意边界)实现:public class Solution { public ListNode FindKthToTail(ListN...原创 2019-05-26 10:10:53 · 137 阅读 · 0 评论 -
【剑指offer】从尾到头打印链表
题目描述:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList思路及解法:解法一:借助栈先进后出的性质,创建一个辅助栈,逐个压栈再逐个弹出至数组即可。import java.util.ArrayList;import java.util.Stack;public class Solution { public ArrayList<Integer> prin...原创 2019-05-24 12:14:32 · 121 阅读 · 0 评论 -
【剑指offer】包含min函数的栈
题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。思路: 看到这个问题, 我们最开始可能会想, 添加一个成员变量用于保存最小元素, 每次压栈时如果压栈元素比当前最小元素更小, 就更新最小元素. 但是这样会有一个问题, 如果最小元素被弹出了呢, 如何获得下一个最小...转载 2019-05-26 21:30:31 · 124 阅读 · 0 评论 -
【剑指offer】二叉搜索树的后序遍历序列
题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路:1.首先,俺们要知道什么是后序序列 如下图,后续序列为:DEBFGCA,即先遍历左子树,再遍历右子树,最后遍历根节点,也就意味着,后序序列最后一个元素A为根节点,比A小的序列DEB构成左子树,...原创 2019-05-27 18:19:37 · 190 阅读 · 0 评论 -
【剑指offer】反转链表
题目描述:输入一个链表,反转链表后,输出新链表的表头。实现:链接:https://www.nowcoder.com/questionTerminal/75e878df47f24fdc9dc3e400ec6058ca来源:牛客网public class Solution { public ListNode ReverseList(ListNode head) { ...转载 2019-05-26 10:40:00 · 138 阅读 · 0 评论 -
【剑指offer】二维数组中的查找
题目描述:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路:矩阵是有序的,从左下角来看,向上数字递减,向右数字递增,因此从左下角开始查找,当要查找数字比左下角元素小时,上移要查找数字比左下角元素大时,右移(或者以右上角为基准点,向左数字递减...原创 2019-05-24 09:33:56 · 111 阅读 · 0 评论 -
【剑指offer】变态跳台阶
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路:f(1) = 1f(2) = f(2-1) + f(2-2) //f(2-2) 表示2阶一次跳2阶的次数。f(3) = f(3-1) + f(3-2) + f(3-3)…f(n) = f(n-1) + f(n-2) + f(n-3) + … +...原创 2019-05-24 17:47:24 · 131 阅读 · 0 评论 -
【剑指offer】旋转数组的最小数字
题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路:这是一道二分查找的变形的题目。旋转之后的数组实际上可以划分成两个有序的子数组:前面子数组的大小都大于后...原创 2019-05-24 15:08:47 · 110 阅读 · 0 评论 -
【剑指offer】重建二叉树
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路:前序遍历第一个元素一定为根节点,在中序遍历中根节点左边的节点为左子树,由该节点数可知左子树的前序序列,(如该前序第一个节点为1,则根节点...原创 2019-05-24 12:41:11 · 140 阅读 · 0 评论 -
【剑指offer】二叉树的镜像
题目描述:操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:思路:1.从根节点开始,若根节点不为空,根节点的左右节点不为空,交换左右节点2.若左节点为为叶子节点,则左节点交换结束,若不是叶子节点,则交换左节点的左右节点3.若右节点为为叶子节点,则右节点交换结束,若不是叶子节点,则交换右节点的左右节点4.左右节点均到达叶子节点时,整棵树交换结束实现:public class ...原创 2019-05-26 13:56:47 · 143 阅读 · 0 评论 -
【剑指offer】顺时针打印矩阵
题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.思路:1.确认是否为只有一行或一列的特殊情况2.顺时针将圈一个个剥离,一个圈即一个矩形,如下图,橙色为第一圈,蓝...原创 2019-05-26 20:54:18 · 174 阅读 · 0 评论 -
【剑指offer】替换空格
题目描述:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路及解法:解法一:遍历计算空格数以确定替换后字符串长度(原长+空格数*2),从后往前插入指定内容public class Solution { public String replaceSpace(StringBu...原创 2019-05-24 10:25:23 · 161 阅读 · 0 评论 -
【剑指offer】从上往下打印二叉树
题目描述:从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路:即广度优先搜索1.用一个队列保存每一层的节点,然后逐个搜索2.从队首开始,用数组保存每个节点的值即:1.先将第一层A进队,保存A节点的值2.再将第二层B、C节点进队,再保存B、C节点的值…实现:public class Solution { public ArrayList<Integer&...原创 2019-05-26 23:39:01 · 133 阅读 · 0 评论 -
【剑指offer】数值的整数次方
题目描述:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。思路:借助移位快速幂,参考见:解法:class Solution {public: double Power(double base, int exponent) { long long p = abs((long long)exponent)...原创 2019-05-25 09:06:11 · 119 阅读 · 0 评论 -
【剑指offer】矩阵覆盖
题目描述:我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?思路:本题和跳台阶一样,也是斐波那契的变形题。1.如果n=1,即大矩形为21,则只有一种办法 (类比跳一个台阶)2.如果n=2,即大矩形为2,则有横放或竖放两种办法 (类比跳两个台阶)3.如果n>=2:a.当最后一块为竖放时(如图一浅色方块)...原创 2019-05-24 18:20:32 · 195 阅读 · 0 评论 -
【剑指offer】调整数组顺序使奇数位于偶数前面
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路及解法:解法一:类似于冒泡排序,从后往前,当前偶后奇时交换,每一趟可以排好首元素*时间复杂度O (n^2),空间复杂度O (n)class Solution {public: void reOrde...原创 2019-05-25 11:22:58 · 123 阅读 · 0 评论 -
【剑指offer】二进制中1的个数
题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路及解法:解法一:利用 n & (n - 1)从右向左逐个清除1,(n-1)就相当于把原来的数最右边的一个1变为0,再与原数进行与操作,就能得到这个位置左边保持不变,右边(包括它自己)变为0public class Solution { public int NumberOf1(int n) { ...原创 2019-05-25 09:02:40 · 104 阅读 · 0 评论 -
【剑指offer】斐波那契数列
题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39思路:F(0)=0F(1)=1F(2)=1F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)即记录前面计算的n-1和n-2的值1.迭代:O(n)时间复杂度;2.矩阵相乘:O(logn)时间复杂度(切记不能用递归,不然会导致栈溢出)解法...原创 2019-05-24 17:31:06 · 138 阅读 · 0 评论 -
【剑指offer】树的子结构
题目描述:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路:1.首先查找A中是否有与B的根节点一样的值2.若没有,则判断结束,B不是A的子树3.若有,则判断根节点的左右节点的值是否相同,若不同,则不是,若相同,则判断左节点的左右节点是否相同,若相同,则判断右节点的左右节点是否相同4.递归至达到A或B的叶子节点结束实现:这位大佬的逻辑短...原创 2019-05-26 13:32:37 · 118 阅读 · 0 评论 -
【剑指offer】跳台阶
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。思路:对于本题,前提只有 一次 1阶或者2阶的跳法。1.如果两种跳法,1阶或者2阶,那么假定第一次跳的是一阶,那么剩下的是n-1个台阶,跳法是f(n-1);2.假定第一次跳的是2阶,那么剩下的是n-2个台阶,跳法是f(n-2)3.由a\b假设可以得出总跳法为:...原创 2019-05-24 17:36:51 · 132 阅读 · 0 评论 -
【剑指offer】数组中出现次数超过一半的数字
题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路:“抵消思想”:若有一个数字出现次数超过数组长度的一半,那么将其与其他数字抵消后的结果一定大于01.遍历数组,记录数组可能符合的值以及次数2.初始时假设符合要求的...原创 2019-05-29 09:31:47 · 113 阅读 · 0 评论 -
【剑指offer】用两个栈实现队列
题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路:整体思路是元素先依次进入栈1,再从栈1依次弹出到栈2,然后弹出栈2顶部的元素注意:在交换元素的时候需要判断两个栈的元素情况:1.“进队列时”,队列中是还还有元素,若有,说明栈2中的元素不为空,此时就先将栈2的元素倒回到栈1 中,以保证新进队元素在旧元素之后2.“出队列时”,将栈1的元素...原创 2019-05-24 13:03:34 · 118 阅读 · 0 评论 -
求cos(x)的值(java实现)
题目:输入x值,按照公式计算cos(x)的值,直到最后一项小于10-6为止。cos(x) = 1 - x2/2! + x4/4! - x6/6! + …思路:由公式可知,分子x的次方数和分母的阶乘相同,因此可以考虑用同一变量控制。分母 4!=2! * 3 * 4,分子x4 = x2 * x * x ,因此可以考虑在上一次分母和分子结果的基础上进行计算,而不必重复计算。每一项的正负号相...原创 2019-07-15 18:43:15 · 3777 阅读 · 0 评论 -
简单字符串加密
题目: 输入一个字符串s和数字密钥key,当key为正时,字符串中的字母向后移key个字母;当key为负时,字符串中的字母向前移key个字母。输入: abcd 3输出: defg输入: xyz 3输出: abc思路:由题意可知 |key| 应落在0~26之间,因此应对key进行取模处理将字母转为ascll码后+key移位,移后再转换回字母注意当移...原创 2019-07-15 20:45:44 · 1100 阅读 · 0 评论 -
输入年月日判断是该年的第几天
题目: 输入年月日判断是该年的第几天思路:首先判断该年是否是闰年通过case判断大小月进行累加实现:import java.util.Scanner;public class Calendar { public static void main(String[] args) { // TODO Auto-generated method...原创 2019-07-22 11:21:28 · 869 阅读 · 0 评论 -
输出二叉树的叶子结点、高度及重建二叉树
1.输出二叉树中的叶子结点 思路:在二叉树的遍历算法中增加检测结点的“左右子树是否都为空”void PreorderTraversal( BinTree BT ) { if( BT ) { if( !BT->Left && !BT->Right) //检测左右子树是否都为空 printf("%d ", BT-...转载 2019-06-01 11:01:39 · 2718 阅读 · 3 评论 -
判断是否是水仙花数(java实现)
题目: 一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数思路: for循环控制遍历所有三位数,循环中分别求出每一位,并判断各数字的立方和是否等于该数,若等于,则输出。实现:for(int i =100;i<1000;i++){ int a = i/100; int b = i...原创 2019-07-14 22:09:09 · 468 阅读 · 2 评论 -
判断是否是完数(java实现)
题目: 一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数思路: 静态方法判断是否是完数,是则返回true,不是则返回false.能被该数整除即为该数因子,将因子累加后比较。 若直接用两层循环查找需注意累加清零的位置。实现:public class Perfect...原创 2019-07-14 22:18:13 · 1507 阅读 · 0 评论 -
判断是否是回文数(java实现)
题目: 输入一个数,判断它是不是回文数。思路: 回文数:第一位和最后一位数字相同,第二位和倒数第二位相同… 将该数的各个数位逆序,构造成新数,再与原数比较,若相等,则为回文数,若不等,则不是。 如将1221逆序后仍为1221,则1221为回文数;将1236逆序后为6321,与原数1236不等,则12...原创 2019-07-15 17:53:37 · 837 阅读 · 0 评论 -
判断是否是素数(java实现)
题目:判断一个数n是否是素数思路:素数的定义:只能被1和它本身整除的数①由于1能被任何数整除,因此通过循环判断从2到n-1是否有任何一个数能被n整除,若有则该数不是素数;若直到n-1都没有任何数能被n整除,则该数是素数。②为了保证程序的健壮性,应补充判断输入的数是否为1,若为1则判断为素数 *优化:*若n不能被2整除,那么也不可能被大于n/2的数整除,因此可以将循环范围...原创 2019-07-14 20:45:37 · 523 阅读 · 0 评论 -
两数的最大公约数和最小公倍数(java实现)
题目: 输入2个正整数m,n,求其最大公约数和最小公倍数。思路:方法一:辗转相除方法二:暴力计算 比较输入的两个数m和n谁更小,从较小者开始往下寻找第一个能被m和n同时整除的数,该数即为最大公约数。由数学定理可知,最小公倍数 = 两数乘积 / 最大公约数实现:public class Divisor { public static v...原创 2019-07-15 18:05:42 · 882 阅读 · 0 评论 -
约瑟夫环问题(java实现)
题目: 已知n个人围坐在一张圆桌周围,从编号为start的人开始报数,数到k的那个人出列;他的下一个人又从1开始报数,数到k的那个人又出列;依此规律重复下去,直到圆桌只剩下一个人。思路:用数组a表示这n个人,对应的下标为0~n-1,用0表示未出列,1表示已出列用count记录数到的数,当数到k时此人的对应位置置为1,表示已出列start记录每次开始报数...原创 2019-07-22 11:09:11 · 260 阅读 · 0 评论 -
最求大子序列和
题目描述:求一个序列的最大子序列和思路:在线处理时间复杂度:O(n)实现:int MaxSubseqSum4(int A[],int N){ int ThisSum = 0; int MaxSum = 0; int i; gor(i = 0;i<N;i++){ ThisSun += A[i]; //向右累加 if(ThisSum > Max...原创 2019-05-31 20:01:13 · 169 阅读 · 0 评论 -
开灯问题(java实现)
问题: 有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯被打开,开着灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着。输入:n和k,输出开着的灯编号。k≤n≤1000。样例输入:7 3样例输出:1 5 6 7思路:利用数组进行标记,下标标...原创 2019-07-22 13:33:26 · 697 阅读 · 0 评论