
牛客&Leetcode
在牛客网和leetcode上刷题的一些记录
zhangvalue
在奋进的路上,大家都是独行者!
展开
-
五大常用经典算法-分治-动态规划-贪心-回溯-分支限界
在求解某问题时,经过分析发现该问题具有最优子结构和重叠子问题性质。则适用(动态规划)算法设计策略得到最优解。若了解问题的解空间,并以广度优先的方式搜索解空间,则采用的是(分支限界)算法策略。A.动态规则B.贪心C.回溯D、分支限界E、分治要想直接解决一个较大的问题,有时是相当困难的,分治法的设计思想是将一个难以解决的大问题分解成一些规模较小的相同问题,以便各个击破,分而治之。动态规划法与分治法类似,其基本思想也是将带求解问题分解为若干个子问题,先求解子问题再从这些子问题的解得到原问题的..原创 2021-10-11 18:31:16 · 680 阅读 · 0 评论 -
大顶堆构建、排序过程
一、堆的定义堆是一种非线性结构,可以把堆看作一棵二叉树,也可以看作一个数组,即:堆就是利用完全二叉树的结构来维护的一维数组。堆可以分为大顶堆和小顶堆。堆通常是一个可以被看做一棵树的数组对象,其任一非叶节点满足以下性质:1)堆中每一个节点的值总是不大于或不小于其父节点的值:大顶堆:每个结点的值都大于或等于其左右孩子结点的值。即: arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]。小顶堆:每个结点的值都小于或等于其左右孩子结点的值。原创 2021-10-11 10:38:58 · 650 阅读 · 0 评论 -
Leeccode反转字符串 II
给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。示例:输入: s = “abcdefg”, k = 2输出: “bacdfeg”提示:该字符串只包含小写英文字母。给定字符串的长度和 k 在 [1, 10000] 范围内。思路 以2k为一组数据。 1、每次取一块数据如果大于2原创 2021-04-29 20:21:13 · 291 阅读 · 0 评论 -
JAVA-字符串连续出现字母进行压缩
字符串连续出现的字母进行压缩举例:输入为xxxyyyyyyz压缩后为 3x6yz解题思路:通过在对输入字符串的遍历循环中借助一个StringBuffer变量sb进行字符串的拼接在遍历中的firstChar每次都会取到没有遍历字符串中的第一个位置,一开始从位置0开始for循环遍历也是从i=1开始,因为已经取了firstChar为第0个位置了count变量初始值为1,是...原创 2019-11-22 23:22:36 · 1287 阅读 · 0 评论 -
LeetCode 49题. 字母异位词分组
题目描述给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。示例:输入: ["eat", "tea", "tan", "ate", "nat", "bat"],输出:[ ["ate","eat","tea"], ["nat","tan&quo原创 2018-12-23 10:46:49 · 392 阅读 · 0 评论 -
亚线性算法-水库抽样(Reservoir Sampling)算法
空间亚线性算法:由于大数据算法中涉及到的数据是海量的,数据难以放入内存计算,所以一种常用的处理办法是不对全部数据进行计算,而只向内存里放入小部分数据,仅使用内存中的小部分数据,就可以得到一个有质量保证的结果。数据流算法:是指数据源源不断地到来,根据到来的数据返回相应的部分结果。适用于两种情况:第一、数据量非常大仅能扫描一次时,可以把数据看成数据流,把扫描看成数据到来。第二、数据更新非常快,不能...原创 2018-11-18 13:53:04 · 1349 阅读 · 0 评论 -
解决哈希(HASH)冲突的主要方法
Hash冲突发生的场景:当关键字值域远大于哈希表的长度,而且事先并不知道关键字的具体取值时。hash冲突就会发 生。Hash溢出发生的场景:当关键字的实际取值大于哈希表的长度时,而且表中已装满了记录,如果插入一个新记录,不仅发生冲突,而且还会发生溢出。解决Hash冲突和溢出的方法主要有:开放地址法和拉链法。1、开放定址法 当冲突发生时,使用某种探查(亦称探测)技术在散列表中形...原创 2018-11-06 11:53:20 · 10591 阅读 · 1 评论 -
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。你可以假设每示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]个输入只对应一种答案,且同样的元素不能被重复利用方法一:暴力法暴力法很简单。遍历每个元素 xx,并查找是否存在一个值与 target...原创 2018-10-06 10:50:35 · 14811 阅读 · 2 评论 -
合并两个长度分别为m和n的有序表,最坏情况下需要比较m+n-1次
最坏的情况就是交叉的情况:比如1 3 52 4 62 4 6设上链指针p,下链q,每次比较后较小节点依次作为“合并后链表的节点”,同时较小链指针后移。某链指空后不再比较。则楼上所给的第一个例子:第一步:1和2比,1小作为新节点,p移至3。第二步,3和2比,2小作为新节点,q移至4。第三步,3和4比,3小,p移至5。第四步,5和4比,4小,q移至6。第五步,5和6比,...原创 2017-08-05 20:43:42 · 27282 阅读 · 9 评论 -
图的存储结构
1.1 邻接矩阵 图的邻接矩阵存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中的边或弧的信息。 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 看一个实例,下图左就是一个无向图。 从上面可以看出,无向图的边数组是一个对称矩阵。所谓对称矩阵就是n阶矩阵的元满足aij = aji。即从...原创 2017-08-05 19:42:58 · 467 阅读 · 0 评论 -
设平衡二叉排序树(AVL树) 的节点个数为n,则其平均检索长度为log2n
平衡二叉树又称AVL树,它或者是一棵空树,或者是具有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1,若将二叉树上节点的平衡因子BF定义为该节点的左子树的深度减去它的右子树的深度,则平衡二叉树上所有节点的平衡因子只可能是-1、0和1。只要二叉树上有一个节点的平衡因子的绝对值大于1,则该二叉树不平衡。AVL树上任何节点的左右子树的深度之差都不...原创 2017-08-03 23:40:31 · 11289 阅读 · 0 评论 -
二叉排序树(Binary Sort Tree)的查找递归算法
二叉排序树的查找是从根结点开始,沿着某一个分支逐层开始往下比较的过程。若二叉排序树非空,将给定值与根结点的关键字比较,若相等则查找成功。若不等,则当根结点的关键字大于给定关键字值时,在根结点的左子树中查找,否则在根结点右子树中查找。递归调用查找函数,直到返回为找到的结点,或者为空结束。BSTNode *BST_Search(BiTree T,ElemType key)//...原创 2017-08-03 23:27:11 · 11015 阅读 · 3 评论 -
证明:含有n个结点的二叉链表中共有n+1个空链域
方法一:含有n个结点的二叉链表中,链域一共有2*n个(每个点有两个链域)。对于除了根结点以外的每个点都是有一个父亲结点,所以一共有n-1个指针指向某个结点,于是形成n-1个有内容的链域(减1即是父亲结点)所以一共有2*n-(n-1)=n+1个链域没有指向任何东西。或者法二:二叉树中:结点数n=n1+n2+n0,(n0是度数为0的结点,也称叶子结点;n1是度数为1的结点;n2...原创 2019-11-08 14:18:24 · 23930 阅读 · 3 评论 -
LeetCode_前K个高频元素
问题描述:给定一个非空的整数数组,返回其中出现频率前k高的元素。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]说明:你可以假设给定的k总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。 你的算法的时间复杂度必须优于 O(nlogn...原创 2019-03-25 11:41:22 · 575 阅读 · 1 评论 -
leetcode_移除链表中的元素
【题目描述】删除链表中等于给定值val的所有节点。示例:输入: 1->2->6->3->4->5->6, val = 6输出: 1->2->3->4->5同时给定了固定的结点数据结构/** * Definition for singly-linked list. * public class ListNo...原创 2019-03-15 17:13:40 · 325 阅读 · 0 评论 -
牛客_5g和7g砝码
题目描述:有若干5g和7g的砝码,任何大于( )克都能够用5g和7g的砝码组合出A、53B、23C、12D、 53分析:假设满足条件最小的数是n,本身可以拆成若干5和若干7 即 n=5i+7j (其中i、j都是自然数)所以那么比n大1的n+1 也要可以拆成 5和7n+1至少要 加3个5 减2个7n+2也满足至少需要 加1个7 减1个5n+3 需要 加...原创 2019-03-08 10:25:42 · 978 阅读 · 0 评论 -
一个整数的阶乘最后有多少个0
问题: 一个整数的阶乘最后有多少个0分析:整数N的阶乘N!=1×2×3×4×5×6×··· ×N我们可以对N!进行分解质因数即 N!=2x×3y×5z×7w··········其中能够产生0的只有2和5,其他不会产生02和5相乘必然会产生一个10,而这个10会在阶乘的末尾添加一个0。那么问题就转化为2x×5z可以产生多少个0,即min(x,z),显然X肯定大于Z(...原创 2019-08-27 23:35:31 · 902 阅读 · 0 评论 -
牛客_输入一颗二叉树的根节点和一个整数打印二叉树中结点值的和为输入整数的所有路径
问题描述:输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。思路:在进行二叉树中结点的值和对应的整数的值进行比较的同时需要注意的是利用递归的思想,记录的是一条路径就是用ArrayList来进行存储,类型也是ArrayList,在进行递归查询的时候,定义的是根到叶子节点才算一条路径,所以不仅...原创 2019-07-13 21:16:08 · 2156 阅读 · 0 评论 -
牛客_给出股票价格找出买入点和卖出点让利润最大化
问题描述:给你一个整数数组,数组的值代表股票的历史价格。找到买点和卖点,使得利润最大。假设数组为array = {3, 8, 1, 2, 19, 22, 2, 35, 23},那么买点价格是 1, 卖出价格是 35。思路:1️⃣、拿到问题的想法就是:我们可以对每个点和其后面的点作比较,找到最大(array[j] - array[i])。因为i 的范围是 0 到 n - 1 (假设数组长...原创 2019-07-13 20:43:42 · 1356 阅读 · 0 评论 -
LeetCode_验证回文串
题目描述:给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串。示例 1:输入: "A man, a plan, a canal: Panama"输出: true示例 2:输入: "race a car"输出: false思路:因为所给的字符串中既含有标点符号又含有空格,需要对字符串中的...原创 2019-04-04 10:57:28 · 210 阅读 · 0 评论 -
递归
在实现链表的反转的时候可以用到递归算法的方式/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { pu...原创 2017-07-15 10:12:56 · 796 阅读 · 0 评论 -
牛客_机器人的运动范围
题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?分析:在考虑到机器人在移动的过程中都...原创 2019-03-06 10:46:49 · 256 阅读 · 0 评论 -
牛客_n个圆环旋转问题
问题描述:有n个圆环相邻,其中每一个圆环上都是0-9的数字,每个圆环都可按照0-9转动,也可以按照9-0的方向转动现在需要手动转动这个圆环,开启密码,问最少需要转动圆环多少次现在输入三组值:第一行:n 表示圆环的个数第二行:长度为n的圆环当前状态码第三行: 长度为n的圆环开锁密码状态码例一(表示一共有3个圆环,当前圆环状态码为123,圆环开启密码状态码321)...原创 2019-03-14 21:19:30 · 973 阅读 · 0 评论 -
折半插入排序
基本思想 考虑到 L.r[1..i-1] 是按关键字有序的有序序列,则可以利用折半查找实现“ L.r[1…i-1]中查找 L.r[i] 的插入位置”如此实现的插入排序为折半插入排序。折半插入排序在寻找插入位置时,不是逐个比较而是利用折半查找的原理寻找插入位置。待排序元素越多,改进效果越明显。packagesort.insertionSort;publicc...原创 2019-03-13 10:55:50 · 886 阅读 · 0 评论 -
牛客_矩阵查数
【题目描述】给定一个二维整型矩阵,已知矩阵的每一行都按照从小到大的顺序排列,每一列也都按照从小到大的顺序排列。现在给出一个数,请写一个函数返回该数是否存在于矩阵中。输入两个整数m,n, 且 0<m<=3000, 0<n<=3000。接着输入一个vector<vector<int>> matrix矩阵,大小为m行n列,与一个int k,为...原创 2019-03-11 15:53:54 · 420 阅读 · 0 评论 -
直接插入排序
【直接插入排序基本思想】把n个待排序的元素看成一个有序数组和一个无序数组,开始时有序数组中只有一个元素,无序数组中有n-1个元素。直接插入即表示将一个新的数据插入到一个有序数组中,并继续保持有序。每一步将一个待排序的记录,插入到前面已经排好序的有序数组中去,直到插完所有元素为止。直接插入排序是稳定排序算法。例如有一个长度为N的无序数组,进行N-1次的插入即能完成排序;第一次,数组...原创 2019-03-08 18:54:48 · 340 阅读 · 0 评论 -
冒泡排序
【冒泡排序的基本思想】对相邻的元素进行两两比较,顺序相反则进行交换,这样,每一趟会将最小或最大的元素“浮”到顶端,最终达到完全有序在冒泡排序的过程中,如果某一趟执行完毕,没有做任何一次交换操作,比如数组[5,4,1,2,3],执行了两次冒泡,也就是两次外循环之后,分别将5和4调整到最终位置[1,2,3,4,5]。此时,再执行第三次循环后,一次交换都没有做,这就说明剩下的序列已经是有序的,排...原创 2019-03-08 18:46:39 · 355 阅读 · 0 评论 -
简单选择排序
【简单选择排序基本思想】简单选择排序又叫直接选择排序,是最简单直观的一种算法,为每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止。简单选择排序是不稳定排序。无论数组原始排列如何,比较次数是不变的;对于交换操作,在最好情况下也就是数组完全有序的时候,无需任何交换移动,在最差情况下,也就是数组倒序的时候,交换次数为n-1次。综合,都是需要双层fo...原创 2019-03-08 18:41:12 · 828 阅读 · 0 评论 -
牛客_数组中重复的数字
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。分析:方法一:1️⃣从头到尾依次扫描这个数组中的每一个数字,当扫描到下标为i的数字时,首先比较下标为i的数字n...原创 2019-03-05 14:59:10 · 494 阅读 · 0 评论 -
牛客_不用加减乘除做加法
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路:由于常见的运算的方式加减乘除都不得使用,那么就看看别人的思路首先看十进制是如何做的: 5+7=12,三步走第一步:相加各位的值,不算进位,得到2。第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果。第三步:重复上述两步,只是相加的值变成上述两步的...原创 2019-02-28 22:03:49 · 271 阅读 · 0 评论 -
Leetcode_删除排序数组中的重复项
题目描述:给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。示例 :给定 nums = [0,0,1,1,1,2,2,3,3,4],函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0,1,2,3,4。你不需要考虑...原创 2019-02-28 21:12:44 · 420 阅读 · 0 评论 -
牛客_求1+2+3+...+n
题目描述求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路一:首先想到的是使用递归的方法,难点就是递归结束的条件不好想,最终巧妙利除法中被除数不能为0的特点来//确保只要n不为0的情况之下i每次都为1,依次累加1达到最终累加和的目的//利用了只要n为0的情况就catch退出的目的...原创 2019-02-28 13:09:55 · 465 阅读 · 0 评论 -
牛客_找寻第n个丑数
题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。分析:一个丑数的质因子只有2,3,5,那么丑数p = 2 ^ x * 3 ^ y * 5 ^ z,换句话说一个丑数一定由另一个丑数乘以2或者乘以3或者乘以5得到,那么我们从1开始乘以2,3,5,就得...原创 2019-02-28 12:43:13 · 257 阅读 · 0 评论 -
牛客_第一个只出现一次的字符
题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).分析:这个道题只是问到出现一次的情况,在考虑到遍历数组的长度比较长的时候,可以使用hashmap因为 HashMap中是不会存放相同的键的,当你存放一个map中已存在的键时会把原来的覆盖掉。这样就会统计出各个元素出现的...原创 2019-02-27 11:45:27 · 274 阅读 · 0 评论 -
牛客_把整数数组排成最小的数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。分析:因为最终让输出的是String类型,想到使用String和int类型之间相互转化的方式(String.valueOf())和Integer.valueOf()来方便比较,问题的关键就是在于如何取...原创 2019-02-26 22:51:59 · 335 阅读 · 0 评论 -
牛客_整数出现1的次数
题目描述求出任意非负整数区间中1出现的次数(从1 到 n 中1出现1的次数)分析:单独考虑每一位数上产生1的情况最后累加汇总设N = abcde ,其中abcde分别为十进制中各位上的数字。 如果要计算百位上1出现的次数,它要受到3方面的影响:当前位数百位上的数字,百位以下(低位)的数字,百位以上(高位)的数字。(下面的举列子只是以百位为例子其他位同样的道理)例如:12113...原创 2019-02-26 22:02:46 · 717 阅读 · 0 评论 -
牛客_连续子数组的最大和
题目描述连续子数组的最大和,例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)思路:用total记录累计值,maxSum记录和最大基于思想:对于一个数A,若是A的左边累计数非负,那么加上A能使得值不小于A,认为累计值对整体和是有贡献的。如果前几项...原创 2019-02-26 16:47:18 · 349 阅读 · 0 评论 -
牛客_最小的k个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。思路:一、冒泡法的原理由于是在寻找出n个数字中最小的k个数,可以采用冒泡法的原理,每次冒出一个最小值,将这个最小值添加到辅助输出数组中或者是先调用Arrays的sort方法直接排序再选择输出。import java.util.ArrayList;...原创 2019-02-25 14:06:43 · 427 阅读 · 0 评论 -
牛客_数组中出现次数超过一半数组长度的元素
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路:采用使用hashmap的方式,其中一个作为接收数组元素的标识,另一个作为该元素出现的次数可以直接在hashmap中判断元素是否超过总长度的一半,不需要再次遍历数...原创 2019-02-25 11:00:37 · 534 阅读 · 0 评论 -
牛客_二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。假设输入的数组的任意两个数字都互不相同。补充:二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树:(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3)左、右子树也分别为二叉排序树;(4)没有键值相等的节点思路:...原创 2019-02-24 17:25:41 · 440 阅读 · 0 评论