剑指offer数组3】的更多相关文章

数组中的重复数字 题目描述 牛课网链接 长度为 n 的数组里,所有数字都在 0 到 n-1 的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 7 的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字 2 或者 3.(牛课网这里弄成「那么对应的输出是第一个重复的数字 2」了) A 简单实现思路 借助外部数组 b,原数组中的数字记为外部数组的下标,外部数组的值来存储这个数字出现的次数.原数组中…
在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2. 思路:1.暴力法:直接遍历一遍,使用哈希map存储元素,然后找到第一个value值大于1的元素. 2.非常巧妙的方法,剑指offer书上. 1.判断输入数组有无元素非法 2.从头扫到尾,只要当前元素值与下标不同,就做一次判断,num…
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.   思路: 因为有2个数字只出现了一次,而其他的数字都是2次,可以通过异或运算,得到最后这2个只出现一次的数字的 异或结果值.这种值必然不为0. 然后找出这个数字二进制中,最低位为1的位数,必然那一位一个是0,一个是1. 通过这个条件将原数组分为2部分,分别异或,得到结果.   代码: class Solution { public: void FindNumsAppearOnce(vecto…
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数.     分析:利用归并排序的思想,分成2部分,每一部分按照从大到小排序,然后比较左侧的a[i]和右侧的b[j]   若a[i]>b[j],那么a[j]大于b[j]~b[right], 产生 right-j+1 组逆序对. 若a[j]<=b[j],不产生逆序对.   同时更新数组的从left到right部分,实现其从大到小排序,然后在拿排序号的数组和更大的数组进…
面试题11:旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. NOTE:给出的所有元素都大于0,若数组大小为0,请返回0. 考察对二分查找的理解 1. 定义两个指针.第一个 index1 指向第一个元素,第二个 index2 指向最后一个元素. 2. 数组的中间元素 indexMid.如果该中间元素位于前面的递增…
面试题39:数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果不存在则输出0. 解法一: 用于笔试使用快排sort,时间复杂度为O(NlogN),并非最优先排序,找出中间那个数; 计算中间数的出现次数,如果超过数组长度的一半,返回,否则返回0 class Solution { public: int MoreThanHalf…
面试题3:数组中重复的数字 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2. // 参数: // numbers: 一个整数组 // length: 数组的长度 // duplication:输出数组中的一个重复的数字 //返回值: // true - 输入有效,并且数组中存在重复…
一.数组 面试题3 : 找出数组中重复的数字 面试题3(二):不修改数组找出重复的数字 面试题4:二维数组的查找 面试题21:调整数组顺序使奇数位于偶数前面 面试题39:数组中出现次数超过一半的数字 面试题42:连续子数组的最大和 面试题53:数字在排序数组中出现的次数 面试题53(二):0~n-1中缺失的数字 面试题53(三):数组中数值和下标相等的元素 面试题11:旋转数组的最小数字 面试题56:数组中只出现一次的数字 面试题57:和为s的数字 面试题57(二):和为s的连续正数序列…
题目描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2. 分析: 方法1: 用map保存每个数字出现的次数. 方法2: 不需要额外的数组或者hash table来保存,题目里写了数组里数字的范围保证在0 ~ n-1 之间,所以可以利用现有数组设置标志,当一个数字被访问过后,可以…
题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 分析: 数组中一共有偶数个数.两个数字只出现过一次. 相同数异或在一起等于0,那么将所有数异或最后结果就是只出现过一次的数异或在一起的结果. 那么我们找到结果中的某一位的bit位为1,将整个数组按照该位为0和1分成两组, 肯定可以分成两组,因为如果没有0组的话,那么数组就只可能有奇数个数:没有1组的话,那么结果不可能得到该位为1. 两组内分别进行异或,得到两个结果,这两个结果就是只出现过一次…
题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000000007   输入描述: 题目保证输入的数组中没有的相同的数字 数据范围: 对于%50的数据,size<=10^4 对于%75的数据,size<=10^5 对于%100的数据,size<=2*10^5 示例1 输入 1,2,3,4,5,6,7,0 输出 7 分析: 二分归并解法. 归并…
题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果不存在则输出0. 分析: 主元素问题.只要每次都从数组中移除两个不相同的数值, 如果有出现的次数超过数组长度的一半的数,那么就是最后剩下来的那个. 最后再检验一次是否有这样的数. 代码: class Solution { public: int MoreThanHalfNum_Solution…
题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果不存在则输出0. 思路: 第一种思路: 出现次数超过一半的数字,不管如何,必然这个数字位于数组中间的位置,因此可以采用类似于快排的划分的方法,找到位于数组中间的位置的数字,然后在顺序检索是否这个数字出现次数超过一半. def function_partion(lists, left, right…
看题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果不存在则输出0. 我的直接思路: 用map计数,简单直接,遍历一次数组,用hashmap记录,key为int值,value为出现次数: 第二次再用map.entrySet找出有没value大于数组长度一般的entry,有的话返回它的key. 时间复杂度也是2n而已,这个方法时间复杂度是O(n)空…
题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 看题目脑子里就出现做法了: 遍历,用个HashMap来记录出现的次数,然后再遍历HashMap返回的EntrySet找出出现一次的数字搞定. 代码顺便上下吧: public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) { HashMap<Integer, Integer> map = new HashMap<…
蛮力: 遍历数组,对每个元素都往前遍历所有元素,如果有发现比它小的元素,就count++. 最后返回count取模. 结果没问题,但超时哈哈哈,只能过50%.   归并法: 看讨论,知道了这道题的经典做法应该是用归并的思想,之所以用归并,是因为像上面我们直接比较a[i]后面的所有元素的话,肯定是O(n^2)的,那么就先考虑它旁边周围的元素,然后就归并了.   好像之前也就写过归并的伪代码,所以我看了下大概思路,然后就开始写了,一开始是每次mergeSort方法里面,就要递归用的那个方法里面,都n…
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 牛客网链接 思路 链接:https://www.nowcoder.com/questionTerminal/e02fdb54d7524710a7d664d082bb7811?f=discussion 来源:牛客网 首先:位运算中异或的性质:两个相同数字异或=0,一个数和0异或还是它本身. 当只有一个数出现一次时,我们把数组中所有的数,依次异或运算,最后剩下的就是落单的数,因为成对儿出现的都抵消…
题目描述 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000000007 输入描述: 题目保证输入的数组中没有的相同的数字 数据范围: 对于%50的数据,size<=10^4 对于%75的数据,size<=10^5 对于%100的数据,size<=2*10^5 牛客网链接 思路 链接:https://www.nowcoder.com/que…
题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果不存在则输出0. 思路 思路二:如果有符合条件的数字,则它出现的次数比其他所有数字出现的次数和还要多. 在遍历数组时保存两个值:一是数组中一个数字,一是次数.遍历下一个数字时,若它与之前保存的数字相同,则次数加1,否则次数减1:若次数为0,则保存下一个数字,并将次数置为1.遍历结束后,所保存的数…
1. 题目 2. 解答 借助于归并排序的分治思想,在每次合并的时候统计逆序对.因为要合并的两个数组都是有序的,如果左半部分数组当前值大于右半部分数组当前值,那么左半部分数组当前值右边的数就都大于右半部分数组当前值,这些数据对也就构成了逆序数对. 比如上图中 [3, 8, 9, 11] 和 [1, 2, 5, 6] 合并的时候,发现 3>1,那么 (3, 1).(8, 1).(9, 1) 和 (11, 1) 就构成了 4 个逆序数对,逆序对数加 4. 下面的代码中定义了一个 result 来记录逆…
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果不存在则输出0. 思路一遍历数组是保存两个值:一个是数字中的一个数字,另一个是次数.当遍历到下一个数字的时候,如果下一个数字和之前保存的数字相等,则次数加1:如果不同,则次数减1:如果次数为零,那么我们需要保存下一个数字,并把次数设置为1.由于我们要找的数字出现的次数比其他所有数字出现的次数之和还…
package 数组; /*在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的. 也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为7的数组{2,3,1,0,2,5,3} ,那么对应的输出是第一个重复的数字2.*/ public class 数组中重复的数字 { public boolean duplicate(int nums[],int length,int [] duplication) { /*这道题…
问题描述: 在长度为n的数组中,所有的元素都是0到n-1的范围内. 数组中的某些数字是重复的,但不知道有几个重复的数字,也不知道重复了几次,请找出任意重复的数字. 例如,输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出为2或3 解题思路: 1.判断输入数组有无元素非法  2.从头扫到尾,只要当前元素值与下标不同,就做一次判断,numbers[i]与numbers[numbers[i]],相等就认为找到了重复元素,返回true,否则就交换两者,继续循环.直到最后还没找到认为没找到重…
原创博文,转载请注明出处! http://github.com/wanglei5205 http://cnblogs.com/wanglei5205 # 题目 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4 # 思路 基于Partition的思路 时间复杂度为O(n) 基于红黑树的思路 辅助容器:定义用于遍历向量的辅助容器--迭代器ite:定义用于存储结果的辅助容器--多重集合res. 基本思路:首先创建一个大小为k的容器,…
来源:http://www.acmerblog.com/offer-6-2429/ 题目来自剑指offer系列 九度 1516 题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每个输入文件包含一组测试案例. 对于每个测试案例,第一行输入一个n,代表该数组中数字的个数. 接下来的一行输入n个整数.代表数组中的n个数. 输出: 对应每个测试案例, 输入一行…
问题描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 思路: 1.最简单的想法,不考虑时间复杂度,扫描数组,遇到偶数,先取出这个数,然后把它后面的数字都往前面移动一位,这样最后空出一位放该偶数即可.但显然这样会重复移动很多次.时间复杂的O(n^2) 2.在前后安排两个哨兵i,j,前面的用来指示偶数(即扫描如果是奇数就往后走),后面的用来指示奇数(遇到偶数就往前面走),当i扫描到偶数而j扫描到奇数时,我们就将其交换.类似扫描…
转载请注明出处:http://blog.csdn.net/ns_code/article/details/25829395 剑指offer上的第14题,九度OJ为了确保输出的结果的唯一性,在输出上做了改动,因此採用的方法自然与书本上不同,这里没有限制,思来想去还是用最简单的方法来做了,很easy的方法,直接上代码. 题目描写叙述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得全部的奇数位于数组的前半部分,全部的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置…
採用二分查找的策略,重点要考虑一些边界情况:旋转了0元素.即输入的是一个升序排列的数组.仅仅包括一个数字的数组.有非常多反复数字的数组等. AC代码: #include<stdio.h> #include<stdlib.h> int main() { int n; while(scanf("%d",&n) != EOF) { int *A = (int *)malloc(n*sizeof(int)); if(A == NULL) exit(EXIT_FA…
题目1384:二维数组中的查找 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:7318 解决:1418 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.   输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数. 输入的第二行包括一个整数t(1<=t<=…
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 剑指offer书里的版本,没有要求相对位置不变,而是给出了函数指针版本,替换判断是奇数的函数,可以提供将满足X条件的数字挪到不满足X条件的数字前面. 快速排序的变形,和书上的不一样,我用了几乎非常接近快速排序的代码: class Solution { public: void reOrderArray(vector<int>…