![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
tangyuan_sibal
每一份努力都值得期许
展开
-
算法--二分查找的精妙之处
今天做腾讯的暑假实习编程题,其中有一道题目是这样子的:小Q的父母要出差N天,走之前给小Q留下了M块巧克力。小Q决定每天吃的巧克力数量不少于前一天吃的一半,但是他又不想在父母回来之前的某一天没有巧克力吃,请问他第一天最多能吃多少块巧克力作为菜鸡的我只能跑出百分之二十的测试用例。。。。。。。然后就按常例跑去讨论区看大佬的解法,有一个大佬用了二分查找来做这道题,只能说自己是真的菜,。。。思路都...原创 2019-03-09 00:40:08 · 136 阅读 · 0 评论 -
算法---求一个数组中两个只出现一次的数字(移位运算和二进制运算的精髓)
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。比如{2 ,4 ,3, 4 , 6 ,3, 5},则这两个数字是2和5,要求时间复杂度为O(N),空间复杂度为O(1)思路:1)首先我们要了解一个知识就是异或运算的功能。一个数异或自己为0,异或0为本身。转化为二进制就是两个数相同位为0,不同位为1。2)我们首先从一个数组中只出现一次的数字来做。比...原创 2019-04-06 01:08:53 · 125 阅读 · 0 评论 -
算法----求是否是平衡二叉树(剪枝方法)
输入一棵二叉树,判断该二叉树是否是平衡二叉树。思路一:暴力递归,判断每个两边的高度差是否大于1,但是会有很多多余的计算public boolean IsBalanced_Solution(TreeNode root) { if(root==null) return true; int left = TreeDepth(root.lef...原创 2019-04-06 00:09:23 · 205 阅读 · 0 评论 -
算法---第一个只出现一次的字符
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).思路一:暴力破解,直接循环找到只出现一次的,时间复杂度为O(n^2) int flag = 0; int index = -1; for(int i = 0;i<str.length();i++){ for...原创 2019-03-31 21:03:45 · 89 阅读 · 0 评论 -
算法---求一颗树的最大深度
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。原创 2019-04-04 23:22:43 · 6487 阅读 · 0 评论 -
算法--把数组排成最小的数
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。解题思路:先将整型数组转换成String数组,然后将String数组排序,最后将排好序的字符串数组拼接出来。关键就是制定排序规则。排序规则如下:若ab > ba 则 a > b,若ab < ...原创 2019-03-26 21:30:09 · 166 阅读 · 0 评论 -
算法---1~n中1出现的次数
求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。思路:从1~N进行遍历,然后求每一个数出现1的次数进行累加,但是这样的时间复杂度为O...原创 2019-03-26 20:22:24 · 1315 阅读 · 2 评论 -
算法---最长不含重复字符的子字符串(暴力和动态规划)
最长不含重复字符的子字符串请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含从’a’到’z’的字符。例如,在字符串中”arabcacfr”,最长非重复子字符串为”acfr”,长度为4。思路一:暴力破解,遍历所以的子字符串,判断其中的不重复的子字符串,这样还可以求出最长不重复子串是哪一个/**///暴力破解求解最长不含重复字符的子字符串 pu...原创 2019-03-30 21:35:16 · 5213 阅读 · 1 评论 -
算法---求空间中多个点中,组成面积最大的三个点
三维空间中有N个点,每个点可能是三种颜色的其中之一,三种颜色分别是红绿蓝,分别用’R’, ‘G’, 'B’表示。现在要找出三个点,并组成一个三角形,使得这个三角形的面积最大。但是三角形必须满足:三个点的颜色要么全部相同,要么全部不同。思路:问题1:遍历所有可能的3个点 for(int i = 0; i < n; i++) for(int j = i + 1; j <...原创 2019-04-01 21:22:33 · 933 阅读 · 0 评论 -
算法---移动最少次数使数组有序(尾插入)
度度熊有一个N个数的数组,他想将数组从小到大 排好序,但是萌萌的度度熊只会下面这个操作:任取数组中的一个数然后将它放置在数组的最后一个位置。问最少操作多少次可以使得数组从小到大有序?如:输入 4 19 7 8 25 输出:2思路:复杂度 nlogn 但是需要一个 n 的辅助数组用一个辅助数组对所有元素进行排序,从小到大排序从第一个排好序的元素开始,即最小的元素开始与没排好...原创 2019-04-01 21:42:55 · 7720 阅读 · 2 评论 -
KMP算法简解
一、KMP解决的问题一个字符串s1=“BBCABCDABABCDABCDABCDABDE”,和一个模式串s2=“ABCDABD”;现在要求s2于s1匹配的开端位置。如本串的位置就是 “BBCABCDABABCDABCDABCDABDE”,开端位置就是A,下标为17二、KMP的过程KMP主要分为两个过程。一个是求next数组。另一个是根据next数组移动。(一)求next数组(1)求解ne...原创 2019-06-19 22:22:53 · 183 阅读 · 0 评论 -
动态规划的套路----左神
一、动态规划首先动态规划不是一种数据结构,而是一种优化,它是一种用空间换时间的套路,它是递归的进阶版本。二、动态规划的套路使用动态规划套路的一个原则是能想出递归的解法。由递归来改成动态规划。我们以这套例题来解释动态规划的套路第一步: 写出递归的“试”法,看看如何尝试可以解决问题。num:表示前几步已选择的值的和, 变量id:在下标为 0 — id-1中的数中进行选择,变量targ...原创 2019-06-19 20:03:47 · 1209 阅读 · 0 评论 -
字符转为数字---一个奇怪的现象
Implement atoi which converts a string to an integer.The function first discards as many whitespace characters as necessary until the first non-whitespace character is found. Then, starting from thi...原创 2019-04-19 21:03:15 · 162 阅读 · 0 评论 -
求最少篮子个数---最大公约数
这是一道360的笔试题,有几种颜色的球,每个球有n个。求最少用几个篮子可以将这些球装到篮子里,每个篮子只有一种颜色的球且最少2个球。同一个颜色的球可以装到不同篮子。思路:采用最大公约数求。package mttest;import java.io.*;import java.util.*;import java.util.Map.Entry;import java.text.*...原创 2019-04-24 21:12:51 · 204 阅读 · 0 评论 -
动态规划简单题小结
198、House RobberYou are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is th...原创 2019-04-27 17:08:07 · 239 阅读 · 0 评论 -
算法---约瑟夫环问题
每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一个小朋友...原创 2019-04-08 23:57:31 · 220 阅读 · 0 评论 -
算法---扑克牌中的顺子(位图的运用)
首先先学一下什么是位图看这里看这里LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q...原创 2019-04-08 00:01:49 · 1196 阅读 · 0 评论 -
算法---序列化和反序列化一棵树
请实现两个函数,分别用来序列化和反序列化二叉树.比如这样的一棵二叉树1/ \2 3/ \ \4 5 6序列化结果为1,2,4,,,,,5,,,,,3,,6,,6,,6,,$反序列化就是根据序列化的结果重构出这棵树思路,首先就是要思考怎么样冲序列化的结果来重构出这棵树。想到用先序遍历方式,它以根节点开始,而构建一棵二叉树也是从根节点开始。版...原创 2019-03-23 20:31:35 · 415 阅读 · 0 评论 -
算法---巧妙的二分查找
统计一个数字在排序数组中出现的次数。思路:看到有序,想到二分查找。因为data中都是整数,所以可以稍微变一下,不是搜索k的两个位置,而是搜索k-0.5和k+0.5这两个数应该插入的位置,然后相减即可。public class GetNumberOfK { public static void main(String[] args) { int array[] = {1,2...原创 2019-04-03 21:58:18 · 105 阅读 · 0 评论 -
算法--用Map来取代数组解决数组的局限性
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路:我的想法就是用元素当做数组的下标,然后当下标(数)一样的时候这个数加1。最后找出数组中最大的那个数,判断它是否超过给定数组的长度的一半public class Sol...原创 2019-03-24 20:37:54 · 439 阅读 · 0 评论 -
算法-求是否是对称二叉树
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路:看到树,递归思想,一棵树是否是对称的,可以看这棵树跟它的镜像是否相等,对于前序遍历(根左右),中序遍历(左根右),后序遍历(左右根)要清楚他们的模样。而且这道题不是基于根递归,而是基于左右子节点的递归/*public class TreeNode { int val...原创 2019-03-17 20:03:31 · 133 阅读 · 0 评论 -
算法--判断字符串是否表示数值
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。思路1、用正则表达式:public class Solution { public boolean isNumeric(char[]原创 2019-03-12 00:23:50 · 431 阅读 · 0 评论 -
算法--递归求树的子结构
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)右树为左树的一个子结构思路:采用递归方法,1、在左树中查找到跟右树根节点相等的节点2、如果找到根节点一样的,判断左右子树是不是相等,如果是,则为true,当右树的所有节点都匹配成功时,则返回结果。/**public class TreeNode { int val = 0; ...原创 2019-03-16 00:28:58 · 190 阅读 · 0 评论 -
算法-栈的压入、弹出序列(我与别人的差距)
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路:使用一个辅助栈来模拟进栈和出栈的过程。我的想法是首先找到第一个进栈的元素,然后开始比较...原创 2019-03-19 21:50:35 · 94 阅读 · 0 评论 -
算法-求反转链表的头节点
输入一个链表,反转链表后,输出新链表的表头。/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode Revers...原创 2019-03-14 00:34:25 · 135 阅读 · 0 评论 -
算法-求链表中环的入口
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路:第一步,找环中相汇点。分别用p1,p2指向链表头部,p1每次走一步,p2每次走二步,直到p1== p2找到在环中的相汇点。第二步,找环的入口。接上步,当p1== p2时,p2所经过节点数为2x,p1所经过节点数为x,设环中有n个节点,p2比p1多走一圈有2x=n+x; n=x;可以看出p1实际走了一个环的步数...原创 2019-03-13 23:49:21 · 124 阅读 · 0 评论 -
算法---杨辉三角来求数学的组合问题
有作死去做算法题,结果又遇到一道题目卡住了,题目是这个样子的:小Q有X首长度为A的不同的歌和Y首长度为B的不同的歌,现在小Q想用这些歌组成一个总长度正好为K的歌单,每首歌最多只能在歌单中出现一次,在不考虑歌单内歌曲的先后顺序的情况下,请问有多少种组成歌单的方法。输入描述:每个输入包含一个测试用例。每个测试用例的第一行包含一个整数,表示歌单的总长度K(1<=K<=1000)。...原创 2019-03-09 10:14:08 · 451 阅读 · 0 评论 -
算法---逆向旋转矩阵法求解矩阵绕圈走
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.思路: 对于一名菜鸡,我的想法就是暴力绕圈圈,结果发现真的把自己给绕进去了。。。,边界值条件太多了,用了5个for差不多跟剑...原创 2019-03-17 21:56:25 · 1226 阅读 · 0 评论 -
算法-求单向链表的倒数第K个节点
输入一个链表,输出该链表中倒数第k个结点。思路1:遍历两次链表,第一次计算总共有几个节点,然后求倒数第k个节点的位置(n-k+1),但是要遍历两次,感觉不够爽, public class Solution { public ListNode FindKthToTail(ListNode head,int k) { ListNode p = head; ...原创 2019-03-12 23:51:42 · 359 阅读 · 0 评论 -
算法---礼物的最大值
package niukewang;public class GetMaxValue { public static int getMaxValue(int[][]a){ int max = 0; int i = a.length; int j = a[0].length; max = sum(a,i-1,j-1); return max; } publ...原创 2019-03-30 00:55:09 · 735 阅读 · 0 评论 -
算法---把数字翻译成字符串
题目要求:给定一个数字,按照如下规则翻译成字符串:0翻译成“a”,1翻译成“b”…25翻译成“z”。一个数字有多种翻译可能,例如12258一共有5种,分别是bccfi,bwfi,bczi,mcfi,mzi。实现一个函数,用来计算一个数字有多少种不同的翻译方法。参考至该作者自上而下,从最大的问题开始,递归 : 12258 ...原创 2019-03-29 21:17:54 · 307 阅读 · 0 评论 -
算法--二叉搜索树转为双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。采用中序遍历的方法,当遇到出栈节点的时候,做指针的指向操作,当前节点的右指针指向下一个节点,下一个节点的左指针指向当前节点,注意第一个节点的指针有所不同,当然如果一开始将pre设为空,好像也可以都一样。import java.util.Stack;/**public cl...原创 2019-03-22 21:43:47 · 315 阅读 · 0 评论 -
算法---复杂链表的复制
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)思路:注意要时刻注意空指针的处理,不然会报空指针异常/*public class RandomListNode { int label; RandomLis...原创 2019-03-22 20:14:22 · 111 阅读 · 0 评论 -
算法--用大堆顶小堆顶结合求中间数
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。思路:大堆顶和小堆顶的特点就是最大值在最上面和最小值在最上面,如果在小堆顶的顶部存比大堆顶的顶部大的数,则整个小...原创 2019-03-25 20:22:26 · 505 阅读 · 0 评论 -
算法---二叉树中和为某一值得全部路径(递归的神级思路)
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)思路:在做这道题之前,做过腾讯的笔试题,有一道题的题目跟这个类似,但是腾讯比较难一点,不是和,而是加减都有可能,求最短的路径,基本也就是这道题的改编,开始做的时候,按照剑指offer上面的思路...原创 2019-03-21 21:37:03 · 186 阅读 · 0 评论 -
算法---求数组是否是一颗二叉搜索树
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 如输入数组{5,7,6,9,11,10,8},则返回true,输入{7,4,6,5}返回false思路:根据二叉搜索树的性质,左边的数小于根节点,右边的数大于根节点,而后序遍历的顺序是左右根,这样可以知道根一定在最后一个节点,比如上面的数组{5,7,6,...原创 2019-03-21 20:15:55 · 528 阅读 · 0 评论 -
算法---求topK的问题
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。思路:topK问题,构造一个K大小的大顶堆,然后后序的每个数跟堆顶的数比较,比这个数小的换掉。而在JAVA中的PriorityQueue就是一个小顶堆,但是可以进行配置成大顶堆import java.util.ArrayList;import java.util.Co...原创 2019-03-24 22:03:13 · 179 阅读 · 0 评论