![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
隐0士
这个作者很懒,什么都没留下…
展开
-
NC27 集合的所有子集算法 java实现
题目描述现在有一个没有重复元素的整数集合S,求S的所有子集注意:你给出的子集中的元素必须按升序排列给出的解集中不能出现重复的元素示例1输入:[1,2,3]返回值:[[],[1],[2],[3],[1,2],[1,3],[2,3],[1,2,3]]解题思路所有子集的排列组合,就意味着要用dfs回溯了,这里只是简单的列举组合,因此还没涉及到剪枝操作,反而比较容易些。代码实现import java.util.*;public class Solution { public Arr原创 2021-07-11 17:22:00 · 404 阅读 · 0 评论 -
NC83 子数组最大乘积 算法 java实现
题目描述给定一个double类型的数组arr,其中的元素可正可负可0,返回子数组累乘的最大乘积。示例1输入:[-2.5,4,0,3,0.5,8,-1]返回值:12.00000解题思路[0.5,4,0.6,3,0.5,8]题目中是子数组累乘,一定要是连续的子数组,我们向右遍历:对于0.5来说,此时最大乘积只能是0.5自己;下一位4 对于4来说,它与0.5的乘积是2,反而变小了,于是它还不如放弃前面的乘积,直接使用它自己作为当前最大的乘积,也就是从自己开始的最大乘积是4下一位数字是0.6原创 2021-07-11 16:28:43 · 174 阅读 · 0 评论 -
NC29 二维数组中的查找2算法 java实现
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]给定 target = 7,返回 true。给定 target = 3,返回 false。示例1输入:7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]原创 2021-07-11 14:45:05 · 457 阅读 · 0 评论 -
NC46 加起来和为目标值的组合 算法java实现
题目描述给出一组候选数\ C C 和一个目标数\ T T,找出候选数中起来和等于\ T T 的所有组合。\ C C 中的每个数字在一个组合中只能使用一次。注意:给出一组候选数C 和一个目标数T,找出候选数中起来和等于T的所有组合。C中的每个数字在一个组合中只能使用一次。注意:题目中所有的数字(包括目标数\ T T )都是正整数组合中的数字 (a_1, a_2, … , a_ka)要按非递增排序 (a_1<=a_2<= …<=a_ka )结果中不能包含重复的组合组合之间的排原创 2021-07-10 23:16:10 · 337 阅读 · 0 评论 -
NC29 矩阵查找1 算法java实现
题目描述请写出一个高效的在m*n矩阵中判断目标值是否存在的算法,矩阵具有如下特征:每一行的数字都从左到右排序每一行的第一个数字都比上一行最后一个数字大例如:对于下面的矩阵:[[1, 3, 5, 9],[10, 11, 12, 30],[230, 300, 350, 500]]要搜索的目标值为3,返回true;示例1输入:[[1,3,5,9],[10,11,12,30],[230, 300, 350, 500]],3返回值:true解题思路代码实现import jav原创 2021-07-06 20:31:24 · 120 阅读 · 0 评论 -
NC77 调整数组顺序使奇数位于偶数前面 算法java实现
题目描述描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。示例1输入:[1,2,3,4]返回值:[1,3,2,4]示例2输入:[2,4,6,5,7]返回值:[5,7,2,4,6]解题思路可以使用插入排序法,将遇到的奇数跟左边的交换位置,直到最左边为奇数为止,这里也可以将上次移动的奇数位置记下来,重复排序直到列尾,但这样的时间复杂度为O(n*n),于是想想题目的最终结果原创 2021-07-05 21:45:20 · 203 阅读 · 0 评论 -
NC37 合并区间 算法java实现
题目描述给出一组区间,请合并所有重叠的区间。请保证合并后的区间按区间起点升序排列。示例1输入:[[10,30],[20,60],[80,100],[150,180]]返回值:[[10,60],[80,100],[150,180]]解题思路判断两个区间是否重叠,就是看一个区间的开始是不是小于另外一个区间的结束,也就是a.end>b.begin,然后由于本题的区间没有顺序,这对我们依次合并会产生干扰,因此我们需要排序,因此需先对其排序,在这里使用区间的begin进行排序,排完序后使用两个指原创 2021-07-03 23:03:27 · 503 阅读 · 0 评论 -
NC106 三个数的最大乘积 算法java实现
题目描述给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)。示例1输入:[3,4,1,2]返回值:24解题思路该题的测试用例:[2,5,3,1] , [-8,-2,-5,-1], [-5,-1,6,3],[-3,-1,5,0,2],[-1,5,0,2],还有要注意当乘积超过int的时候应该用long来存结果,通过分析可得知,这些组合中智存在两种计算方法最大乘积:1:最小次小最大 2:最大次大次次大,所以题目就编程要找出这原创 2021-06-30 08:27:56 · 166 阅读 · 0 评论 -
NC101 缺失数字 算法-java实现
题目描述从0,1,2,…,n这n+1个数中选择n个数,找出这n个数中缺失的那个数,要求O(n)尽可能小。示例1输入:[0,1,2,3,4,5,7]返回值:6示例2输入:[0,2,3]返回值:1解题思路题目中要求O(n)尽可能小,因此遍历整个数据找出下标和数字值不等于的做法就有待商榷了,为了尽可能缩短时间,可以抽象为二分法找某个数字,找出某个数字不等于他下标,当然这里不等于下标还有可能是缺失那个数字的后面的数字,因为我们先存起来这个不等于的数字后还得继续找,直到找完为止,这里还有两种情况是要原创 2021-06-29 07:49:29 · 451 阅读 · 1 评论 -
NC73 数组中出现次数超过一半的数字 算法java实现
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。你可以假设数组是非空的,并且给定的数组总是存在多数元素。1<=数组长度<=50000示例1输入:[1,2,3,2,2,2,5,4,2]返回值:2示例2输入:[3,3,3,3,2,2,2]返回值:3示例3输入:[1]返回值:1算法思路一开始我想的是先对数组排序,然后因为多的那个数原创 2021-06-29 07:09:30 · 123 阅读 · 0 评论 -
最大公约数算法-java实现
题目求出两个数的最大公约数,如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数。几个自然数公有的约数,叫做这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数。示例1输入:3,6返回值:3示例2输入:8,12返回值:4解题思路遇到求最大公约数的问题首先要想到的就是欧几里得算法,也叫辗转相除法,如果a和b 相除不为0,则需把被除数重新作为除数,余值作为被除数再次运算,直到余值为0为止,那时候的被除数即为最大公约数。这个欧几里得算法的证明方式我这里就不列原创 2021-06-25 07:56:18 · 410 阅读 · 0 评论 -
华为社招机试卷经验总结
在牛客上做了华为的社招题目,感觉还是因为准备不足导致最后不通过,反思了一下,提供以下信息给自己或者也要做的人参考:题目有三道共400分,前面两道较为简单每题100分,后面一道200分,答题满150分即可通过,题目的难度大概为牛客上的中等-稍困难的难度的样子。题目为acm模式,也就是输入输出都是自己操作,不过在示例中会说到如何输入输出,也有示例代码,感觉用那个就可以了,不过为了保险点,我还是在考试前专项练习了输入输出的试题,这个训练在牛客网发给你的机试通知邮件里面有。做题目的界面没有调试功能,题目说调原创 2021-06-25 07:14:11 · 5299 阅读 · 3 评论 -
判断回文算法java实现
题目描述给定一个字符串,请编写一个函数判断该字符串是否回文。如果回文请返回true,否则返回false。示例1输入:“absba”返回值:true示例2输入:“ranko”返回值:false解题思路判断一个字符串是否为回文只要从两边开始,逐渐往中间靠拢判断是否相等,直到中间为止,如果都相等则为回文字符串。代码实现import java.util.*;public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返原创 2021-06-23 22:54:21 · 140 阅读 · 0 评论 -
矩阵的最小路径和算法-java实现
题目描述给定一个 n * m 的矩阵 a,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,输出所有的路径中最小的路径和。示例1输入:[[1,3,5,9],[8,1,3,4],[5,0,6,1],[8,8,4,0]]返回值:12解题思路先把矩阵数组列出来,方便好理解:[1,3,5,9][8,1,3,4][5,0,6,1][8,8,4,0]题目中说从最左上的元素到达最右下的元素只能通过右走或者往下走,一开始我以为可以通过贪心算法,从最左上元素出原创 2021-06-20 15:37:59 · 1148 阅读 · 0 评论 -
两个链表生成相加链表算法-java实现
题目描述假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。给定两个这种链表,请生成代表两个整数相加值的结果链表。例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。示例1输入:[9,3,7],[6,3]返回值:{1,0,0,0}解题思路曾经想过既然是两个链表形成的数字相加,那我把两个链表的数字都取出来分别放入两个long变量,再对其进行相加,得到的数字拆解位数放入一个新的链原创 2021-06-20 10:17:04 · 493 阅读 · 0 评论 -
合并有序链表算法-java实现
描述合并有序链表将两个有序的链表合并为一个新链表,要求新的链表是通过拼接两个链表的节点来生成的,且合并后新链表依然有序。示例1输入:{1},{2}返回值:{1,2}示例2输入:{2},{1}返回值:{1,2}解题思路合并两个有序的链表,就是通过分别比较两个链表从头到尾的节点的大小,然后将较小的节点串起来,为了简单点处理,直接声明个头节点,通过头结点再指向找出的较小的节点,然后循环比下去,直到某个链表为空为止,最后再将下个节点的引用指向未空的链表节点。代码实现import java.u原创 2021-06-19 18:55:12 · 536 阅读 · 0 评论 -
判断链表中是否有环-算法java实现
描述判断给定的链表中是否有环。如果有环则返回true,否则返回false。你能给出空间复杂度的解法么?输入分为2部分,第一部分为链表,第二部分代表是否有环,然后回组成head头结点传入到函数里面。-1代表无环,其他的数字代表有环,这些参数解释仅仅是为了方便读者自测调试示例1输入:{3,2,0,-4},1返回值:true说明:第一部分{3,2,0,-4}代表一个链表,第二部分的1表示,-4到位置1,即-4->2存在一个链接,组成传入的head为一个带环的链表 ,返回true示例2输入:原创 2021-06-19 16:53:28 · 150 阅读 · 0 评论 -
反转链表 算法java实现
题目描述反转链表描述输入一个链表,反转链表后,输出新链表的表头。示例1输入:{1,2,3}返回值:{3,2,1}解题思路其实就是需要将单向链表结构的指针换个方向,但在从第一个原链表节点开始换时,需将下一个节点作为新链表节点的上一个节点,原链表的上一个节点也要保存作为下一个节点的新结构的下一个,所以要定义上一个节点,下一个节点,当前节点三个节点变量,并且在遍历完一个节点后,改变这些值:nextNode=curNode.next;curNode.next=lastNode;lastNode原创 2021-06-19 15:52:55 · 105 阅读 · 0 评论 -
最小的K个数算法-java实现
描述给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。如果K>数组的长度,那么返回一个空的数组示例1输入:[4,5,1,6,2,7,3,8],4返回值:[1,2,3,4]解题思路看到要找出最小的k个数,第一反应就是应该先排序一波,肯定用快排排序啦,然后排序完后再取出前k的数字就可以了。package middle;import java.util.*;/** * 描述 * 给定一个数组,找出其中最小原创 2021-06-19 10:54:35 · 223 阅读 · 0 评论 -
最长无重复子数组算法-java实现
题目描述最长无重复子数组:给定一个数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组示例1输入:[2,3,4,5]返回值:4说明:[2,3,4,5]是最长子数组示例2输入:[2,2,3,4,3]返回值:3说明:[2,3,4]是最长子数组示例3输入:[9]返回值:1示例4输入:[1,2,3,1,2,3,2,2]返回值:3说明:最长原创 2021-06-17 22:31:51 · 985 阅读 · 0 评论 -
数字在升序数组中出现的次数算法-java实现
数字在升序数组中出现的次数统计一个数字在升序数组中出现的次数。示例1输入:[1,2,3,3,3,3,4,5],3返回值:4解题思路看到升序的数组第一反应就是要用二分法来查找再者需要统计出要找的个数在数组中出现的次数,由于是升序可以在找到这个数字后,往前找,和往后找,直到没有这个数字位置,每找到一次就统计一次代码package easy;/** * 数字在升序数组中出现的次数 * 统计一个数字在升序数组中出现的次数。 * 示例1 * 输入: * [1,2,3,3,3,3原创 2021-06-16 23:48:42 · 163 阅读 · 0 评论 -
两数之和算法java实现
题目描述给出一个整数数组,请在数组中找出两个加起来等于目标值的数,你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足 index1 小于index2.。注意:下标是从1开始的假设给出的数组中只存在唯一解例如:给出的数组为 {20, 70, 110, 150},目标值为90输出 index1=1, index2=2示例1输入:[3,2,4],6返回值:[2,3]说明:因为 2+4=6 ,而 2的下标为2 , 4的下标为3 ,又因为 下标2 <原创 2021-06-15 23:33:50 · 1886 阅读 · 0 评论 -
买卖股票的最好时机-贪心算法-java实现
描述假设你有一个数组,其中第i 个元素是股票在第 i 天的价格。你有一次买入和卖出的机会。(只有买入了股票以后才能卖出)。请你设计一个算法来计算可以获得的最大收益。示例1输入:[1,4,2]返回值:3示例2输入:[2,4,1]返回值:2下面说一下思路,其实这道题是想将找出值a与值b之间的差值最大的值,且值a一定要在值b前面,那么我们其实就可以边遍历边算当前的最大差值是多少,直到最末,这种也是四大算法中的贪婪算法思想的体现,算出当前认为最大的值,随着遍历直到有更大的值出现,才换掉。具体实现逻原创 2021-06-15 21:20:38 · 1271 阅读 · 1 评论 -
快速排序java实现
简介快速排序是对冒泡排序的一种改进。它的基本思想是:通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归或者非递归进行,以此达到整个数据变成有序序列。算法核心1.先从数列中取出一个数作为基准数。2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3.再对左右区间重复第二步,直到各区间只有一个数下面是java版的快速排序实现package sort;/*原创 2021-06-14 19:24:25 · 1178 阅读 · 1 评论 -
归并排序java实现
简介归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。算法步骤申请临时的空间,该空间用来存放合并后的序列;再对数组进行按中间位数递归分割,直到单位数为止;对分好的左右两个数组进行合并操作;在合并的逻辑需要左,右两个指针分别对应两个数组的最开始位置(默认两个数组都是升序排列),比原创 2021-06-14 19:16:30 · 1955 阅读 · 1 评论 -
牛客网输入输出(Java)总结
转载自添加链接描述预备知识Windows中的Enter键相当于回车(\r)+换行(\n),分别完成将光标移到行首、移到下一行的功能;nextInt():直至读取到空格或回车之后结束本次的int值;next():直至读取到空格或回车之后结束本次的String值,不可读取回车;nextLine():直至读取到换行符(回车)之后结束本次读取的String,可读取回车(空值)。示例1、读取连续整数输入:包括两个正整数a,b(1 <= a, b <= 10^9),输入数据包括多组。输出:转载 2021-06-10 17:23:17 · 692 阅读 · 0 评论