![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数组
数组类算法题
菜鸡的鼻祖
这个作者很懒,什么都没留下…
展开
-
剑指Offer(第2版)——面试题57:和为s的数字
题目1输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出两个数的乘积最小的。解题思路对于一个数组,我们可以定义两个指针:一个从左往右遍历(pleft),另一个从右往左遍历(pright);首先,我们比较第一个数字和最后一个数字的和curSum与给定数字sum,如果curSum = sum,那么这两个数字就是我们要找的数字;如果c...原创 2020-01-16 22:35:31 · 114 阅读 · 0 评论 -
剑指Offer(第2版)——面试题56:数组中只出现一次的数字
题目一个整型数组里除了两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。解题思路:大家首先想到的是顺序扫描法,但是这种方法的时间复杂度是O(n^2)。接着大家又会考虑用哈希表的方法,但是空间复杂度不是O(1)。应该怎么做才能即满足时间复杂度是O(n)又满足空间复杂度是O(1)的要求呢?我们可以想一想“异或”运算的一个性质,...原创 2020-01-16 15:42:51 · 148 阅读 · 0 评论 -
剑指Offer(第2版)——面试题53:数字在排序数组中出现的次数
题目统计一个数字在排序数组中出现的次数。解题思路既然是已经排序好的数组,那么第一个想到的就是二分查找算法。做法就是使用二分法找到数字k在数组中出现的第一个位置,再利用二分法找到数字k在数组中出现的最后一个位置。时间复杂度为O(logn + logn),最终的时间复杂度为O(logn)。二分查找第一个k:先拿数组中间的数字和k作比较。如果数组中间的数字大于k,则说明k应该出现在中间位置的左...原创 2020-01-13 17:18:35 · 130 阅读 · 0 评论 -
剑指Offer(第2版)——面试题51:数组中的逆序对
题目在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如,在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6)、(7,5)、(7,4)、(6,4)和(5,4)。解题思路思路1:暴力法 顺序扫描整个数组,每扫描到一个数字,逐个比较该数字和它后面的数字的大小。如果后面的数字比它小,则这两个数字就组成一个逆...原创 2019-12-24 22:12:59 · 140 阅读 · 0 评论 -
剑指Offer(第2版)——面试题39:数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解题思路:思路1:数组中有一个数字出现的次数超过数组长度的一半,也就是说它出现的次数比其他所有数字出现次数的和还要多。因此,我们可以考虑在遍历数组的时候保存两个值:一个是数组的...原创 2019-12-02 15:11:29 · 157 阅读 · 0 评论 -
剑指Offer(第2版)——面试题21:调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。1.解题思路:维护两个指针,p1指向数组第一个数字,它只向后移动;p2指向数组最后一个数字,它只向前移动。当p1指针指向偶数,p2指针指向奇数,则交换这两个数字。当p2指针已经在p1指针前面,此时所有奇数已经在偶数前面了。举例:12345->15342。...原创 2019-08-15 22:23:24 · 150 阅读 · 0 评论 -
剑指Offer(第2版)——面试题29:顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如,如果输入如下矩阵: 则依次打印出数字:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10。1.解题思路:我们可以把一个矩阵想象成若干个圈,用一个循环来打印矩阵,每次打印矩阵中的一个圈。...原创 2019-08-31 16:46:25 · 105 阅读 · 0 评论 -
剑指Offer(第2版)——面试题11:旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。1.解题思路: 我们注意到旋转之后的数组实际上可以划分为两个排序的字数组,而且前面的字数组的元素大于或者等于后面字数组的元素。我们还注意到最小的元素刚好是这两个字数组的分界...原创 2019-06-24 19:37:25 · 107 阅读 · 0 评论 -
剑指Offer(第2版)——面试题45:把数组排成最小的数
题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如,输入数组{3,32,321},则打印出这3个数字能排成的最小数字为321323。思路:我们自己定义一个排序规则,对拼接后的字符串进行比较。两个数字a,b能拼接成数字 ab 和 ba:若ab > ba 则 a 大于 b;若ab < ba 则 a 小于 b若ab = ba ...原创 2019-12-09 10:44:47 · 112 阅读 · 0 评论 -
剑指Offer(第2版)——面试题4:二维数组中的查找
题目:一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。1.解题思路:首先选取数组中右上角的数字。如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数组,剔除这个数字所在的列;如果该数字小于要查找的数字,剔除这个数字所在的行。也就是说如果要查找的数字不在数组...原创 2019-06-09 21:58:32 · 114 阅读 · 0 评论 -
剑指Offer(第2版)——面试题3:数组中重复的数字
题目:找出数组中重复的数字。 在一个长度为n的数组里的所有数字都在0~n-1范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。解题思路1: 从头到尾依次扫描这个数组中的每个数字。当扫描到下标为 i 的数字时,首先比较这个数字m...原创 2019-06-09 17:32:35 · 201 阅读 · 0 评论