
数组
加油呐
这个作者很懒,什么都没留下…
展开
-
数组:寻找数组中的最大值与最小值
寻找数组中的最小值与最大值有很多方法:比如分别进行两次遍历,一次求最大值,一次求最小值,需要比较2N次,或者取单元素法,用两个变量分别表示最小值和最大值,min表示最小值,max表示最大值,遍历一次数组,每次取出一个数组先与最小值比较,再与最大值比较等等。这次记录的是取双元素法:每次比较相邻的两个数,较大者与max比较,较小者与min比较,这种方法比较1.5N次。实现的时候需要注意的几点:1)mi...原创 2018-07-12 21:35:33 · 16538 阅读 · 0 评论 -
数组:计算两个有序整型数组的交集
问题描述:假设两个含有n个元素的有序(非降序)整型数组a和b,其中 a = { 0,1,2 ,3,4 }, b = { 1,3,5,7,9 }.那么他们的交集为{ 1,3 }实现思路:1)二路归并法:分别从i,j从头开始遍历两个数组。若当前遍历的位置a[i]==b[j],则次=此数为两个数组的交集,记录下来,并且继续向后遍历a1,b1.若a[i] > b[j] ,则继续向...原创 2018-08-21 11:34:29 · 461 阅读 · 0 评论 -
数组:对数组中的两个子有序段进行合并
问题描述:数组a[0,mid-1]和a[mid,n-1]是各自有序的,对数组a[0,n-1]的两个子有序段进行合并,得到a[0,n-1]整体有序,要求空间复杂度为O(1)。假设数组中的两个子有序段都按升序排列。实现思路:1、插入排序方法,时间复杂度为O(n^2),空间复杂度为O(1)2、首先,遍历数组中下标为【0,mid-1】的元素,将遍历到的元素的值与a[mid]进行比较,如果a...原创 2018-08-20 11:05:10 · 251 阅读 · 0 评论 -
数组:如何求指定数字在数组中第一次出现的位置
问题描述:给定数组 a = { 3,4,5,6,5,6,7,8,9,8}, 这个数组相邻元素之差都为1, 给定数字9, 它在数组中第一次出现的位置下标为8实现思路:方法一:“蛮力”法,顺序遍历一遍数组中每一个元素,与9比较,时间复杂度为O(n)方法二:跳跃搜索法。首先用数组中第一个元素3与9进行比较,差值为6,由于相邻两个元素的差值为1,因此9在数组中出现最早的位置必定为:1+6 ...原创 2018-08-20 10:20:05 · 4458 阅读 · 1 评论 -
数组:如何求数组中两个元素的最小值
问题描述:给定一个数组,数组中含有重复元素,给出两个数n1和n2,求这两个数字在数组中所出现位置的最小距离例如: 数组 { 4, 5, 6, 4, 7, 4, 6, 4, 7, 8, 5, 6, 4, 3, 10, 8}, 4和8的最小距离为2.实现思路:遍历数组,会遇到两种情况:1)当遇到n1时,记录下n1值对应的数组下标的位置n1_index, 通过求n1_index与...原创 2018-08-19 11:02:01 · 2696 阅读 · 0 评论 -
数组:求绝对值最小的数
问题描述:有一个升序排列的数组,数组中可能有正数,负数,0,求数组中元素的绝对值最小的数。分析:分三种情况:1)如果数组第一个元素为非负数,那么绝对值最小的数肯定为数组的第一个元素。2)如果数组的最后一个元素为负数,那么绝对值最小的数肯定为数组的最后一个元素。3)数组中既有正数又有负数时,首先找到正数与负数的分界点,如果分界点恰好为0,那么0就是绝对值最小的数。否则比较分级...原创 2018-08-19 10:24:23 · 2164 阅读 · 0 评论 -
数组:如何求数对之差的最大值
问题描述:数组中的一个数字减去它右边子数组中的一个数字可以得到一个差值,求所有可能的差值中的最大值例如:{1,4,17,3,2,9} 最大的差值为17-2=15分析:(1)“蛮力”法首先,遍历数组,找到所有的差值,然后,从所有差值中找出最大值。具体实现方法为:针对数组a中的每一个元素a[i], 求所有a[i] - a[j] (i<j<n)的值中的最大值。代码...原创 2018-07-31 17:55:21 · 4317 阅读 · 0 评论 -
数组:用递归方法求一个整数数组的最大元素
问题描述:用递归方法求一个整数数组的最大元素分析:递归的求解 “数组第一个元素” 与 “数组中其他元素组成的子数组的最大值” 的最大值代码:public int maxNum(int[] a, int begin){// 子数组的长度 int len = a.length - begin; if(len == 1){ return a[begin];...原创 2018-07-30 21:09:34 · 3313 阅读 · 0 评论 -
数组:如何找出数组中唯一的重复元素
问题描述:数组a[N], 1---N-1 这N-1个数存放在a[N]中,其中某个数重复了1次。写一个函数,找出被重复的数字。要求:每个数组元素只能访问一次,并且不用辅助存储空间。采用数学求和法,因为只有一个数字重复一次,而又是连续的,根据累加和原理,对数组的所有项求和,然后减去1---N-1的和,即为所求的重复数代码:/** * 累加和原理 * 对数组所有项求和,然后...原创 2018-07-30 11:50:56 · 8915 阅读 · 2 评论 -
数组:如何找出数组中只出现一次的数字
问题描述:一个整形数组里除了一个数字以外,其他数字都出现了两次 。 找出这个只出现一次的数字。要求:时间复杂度为O(n), 空间复杂度是O(1)分析:使用异或运算:任何一个数字异或他自己都等于0,如果从头到尾一次异或数组中的每一个数字,那些出现两次的数字全部在异或中会被抵消掉,最终的结果刚好是这个只出现一次的数字代码:private int findNotDouble(i...原创 2018-07-29 18:44:34 · 945 阅读 · 0 评论 -
数组:如何找出数组中第k个最小的数
问题描述:给定一个无序的数组,从一个数组中找出第k个最小的数,例如,数组{ 1,5,2,6,8,0,6 }, 其中第4小的数为5思路分析:方法一:排序法最数组进行排序,排序后的第k-1个位置上的数字即为数组的第k个最小的数,时间复杂度为O(nlogn)方法二:剪枝法采用快速排序的思想来实现。选一个数 tmp = a[n-1] 作为枢纽, 把比他小的数都放在他的左边,比他大的...原创 2018-07-29 17:52:15 · 8095 阅读 · 1 评论 -
数组:如何把一个数组循环右移K位
问题描述:假设要把数组12345678右移2位,变为78123456。分析:方法一:比较移位前后数组序列的形式,不难看出,其中有两段序列的顺序是不变的,即就是 78 和 123456, 可以把这两段看做两个整体,右移k位就是把数组的两部分交换一下。时间复杂度为O(n)步骤:1)逆序数组子序列123456,数组序列的形式为654321782)逆序数组子序列78, 数组序列...原创 2018-07-29 17:37:34 · 6356 阅读 · 0 评论 -
数组:如何求数组中两两相加等于20的组合种数
问题描述:给定一个数组{ 1,7,17,2,6,3,14 } , 这个数组中满足条件的有两对组合 {17,3} {6,14}思路:1.蛮力法 使用两重循环遍历数组来判断两个数的和是否是20,算法复杂度为O(n^2) 代码: public void findSum1(int[]a, int sum){ int len = a.length; ...原创 2018-07-29 17:22:30 · 2816 阅读 · 0 评论 -
数组:找出数组中重复元素最多的数
题目描述:如何找出数组中重复元素最多的数思路:使用Map映射表记录每一个元素出现的次数,然后判断次数大小,进而找出重复次数最多的元素。key表示数组的元素,value表示这个元素在数组中出现的次数。最后对map进行遍历。代码:/** * 使用map(不允许重复的),key是a中元素的值,value是元素出现的次数 * @param a * @return *...原创 2018-07-29 17:00:38 · 6432 阅读 · 1 评论 -
剑指offer: 数字在排序数组中出现的次数
题目描述:数字在排序数组中出现的次数思想:二分查找的改进,分别找到数组中数字k第一次以及最后一次出现的次数start,end,最终的次数就是end-start+1定义了两个变量start,end,表示从start遍历到end,求出start和end的中间位置mid,比较mid与k的大小,有三种情况:a[mid] == k : 如果是寻找第一次出现的位置,并且mid的前一个数不是k,则m...原创 2018-07-15 17:19:52 · 194 阅读 · 0 评论 -
数组:求最大子数组之和
题目描述:一个有N个元素的数组,这N个元素可以是正数也可以是负数,数组中连续的一个或多个元素可以组成一个连续的子数组,一个数组可能有多个这种连续的子数组,求子数组和的最大值实现思路:1.蛮力法:找到所有的子数组,然后求出子数组的和,取所有子数组和中的最大值。时间复杂度为O(n^3)。分析发现,许多子数组都重复计算了。代码:/**方法一: * 进行了3次循环,第三次的循...原创 2018-07-29 11:51:57 · 2979 阅读 · 0 评论 -
数组:找出数组中第二大的数
题目描述:只通过一遍扫描数组即可找出数组中第二大的数思路:设置两个变量来进行判断。max表示数组中的最大的数,初始值为a[0], sec表示第二大的数,初始值为整数的最小值min, 对数组a进行遍历,从1开始,出现两种需要注意的情况:1. 当前元素 > max; 这时sec的值应是max的当前值,并且max的值应是当前元素的值。2. sec < 当前元素 ...原创 2018-07-29 11:19:55 · 6886 阅读 · 0 评论 -
数组:判断一个数组中数值是否连续相邻
问题描述:一个数组序列,元素取值可能是0--65535中的任意一个数,相同数值不会重复出现。0可以重复出现。当从该数组序列中随机选取5个数值,判断这5个数值是否连续相邻。需要注意4点: 1.) 5个数值允许是乱序的,例如{8,7,5,0,6} 2.) 0可以通配任意数值,例如{8,7,5,0,6}中的0可以通配成9或4 3. )0可以多次出现 4. )全0算连续,只有一个非0算连续...原创 2018-08-21 12:12:09 · 2067 阅读 · 0 评论