知识梳理---数组
hy3686_1991
这个作者很懒,什么都没留下…
展开
-
数组------寻找和为定值的两个数
题目描述: 给定一个数组和一个整数,要求在数组中找到两个数,使得它们的和为这个整数. 方法:排序夹逼 首先使用快速排序算法把数组按升序排列,然后使用夹逼的方法找到答案.即使用两个指针分别指向数组的头和尾(begin, end). 1. 若arr[begin] + arr[end] == sum 就输出; 2. 若arr[begin] + arr[end] 3. 若arr[原创 2016-05-11 14:24:02 · 401 阅读 · 0 评论 -
数组------构建乘积数组
题目描述: 给定数组A[n] = {0, 1, …, n-1},要求构建一个数组B[n],使得B[i] = A[0]A[1]…A[i-1]A[i+1]…A[n-1].并且不能使用除法. 分析: 若能使用除法,则B[i] = A[0]A[1]…A[n-1] / A[i].但由于不能使用除法,所以此方法不可行. 方法一: 可以使用蛮力方法,对每个B[i]都重新乘一遍,从而得到结果,复杂度是O(n原创 2016-08-08 09:29:11 · 324 阅读 · 0 评论 -
数组------数组中的重复数字
题目描述: 给定一个长度为n的数组,所有的数组都在0到n-1的范围内,请找出数组内的任意一个重复数字。 分析: 1. 将数组排序,然后从头遍历到第一个重复数字为止; 2. 由于数组长度为n且范围是[0, n-1],那么当数组没有重复元素时, 将其排序的结果是对应下标里的数字等于下标,则我们可以从arr[0]开始,若arr[i] == i,则i++, 否则就比较arr[i]和arr[arr[i原创 2016-08-06 22:27:36 · 229 阅读 · 0 评论 -
数组------将数组元素排成最小数
题目描述: 给定一个数组,将其中的元素组合成一个最小数. 分析: 1. 可以使用蛮力枚举的方法,将所有的可能性都枚举出来,算法复杂度是O(n!) 2. 可以自己制定规则,对于两个数字m 和 n ,将其拼接成数字 mn 或 nm ,判断它们的大小.若mn < nm 那就定义m < n,反之 n < m 或 n = m ; 通过这种方法将数组中所有的数都排序(升序),然后得到结果。(实现时,可原创 2016-07-29 22:06:58 · 270 阅读 · 0 评论 -
数组------数组中的逆序对
题目描述: 给定一个数组,求该数组中的逆序对的个数. 分析: 1. 最简单的方法是使用暴力枚举法.用双重循环,一一比对数组中的每个元素与排在他后面的所有元素,此方法的时间复杂度是O(n^2).void func(vector<int>& data){ if(data.size() < 1) return 0; int count = 0; for(int原创 2016-07-29 18:04:24 · 296 阅读 · 0 评论 -
数组------找出数组中只出现一次的两个数
题目描述: 给定一个数组arr,其中除了特定的两个数以外,其他数都出现两次,现写程序找出这两个只出现一次的数。 分析: 根据题目的特殊性,需要使用到异或。因为相同两个数的异或结果为0。由此我们考虑把数组分为两部分,设法让两个只出现一次的数分别在这两个不同的数组中,而其余的数两次都出现在同一个数组中,再将两个数组分别异或,得到的结果就是要求的两个数。 实现步骤: (1) 先将原创 2016-07-18 15:29:52 · 360 阅读 · 0 评论 -
数组------荷兰国旗问题(颜色排序)
问题描述: 现在有红、白、蓝三色小球若干个,要求对其进行整理,使得同色小球相邻。 思路: 参照快速排序的过程,但使用三个指针first, current 和 end.其中first和current从数组头开始,end指向数组尾。以0表示红色,1表示白色,2表示蓝色。则有: (1) 当*current = 0 时,swap(*current, *first) 并且first++、current原创 2016-05-17 14:22:14 · 439 阅读 · 0 评论 -
数组------奇数偶数排序
题目描述: 给定一个int型数组,要求将数组排序使得奇数都在偶数前面。 分析: 在快速排序过程中,有一个步骤是:选定枢轴元素,并使得枢轴元素前面的元素都小于它而后面的元素都大于它。我们可以比照此方法来实现题目要求,此时时间复杂强度仅为O(n)。 实现1: 使用两个指针一头一尾向中间扫描。#include <iostream>using namespace std;bool isOddNu原创 2016-05-17 10:28:42 · 723 阅读 · 0 评论 -
数组------找零问题
题目描述: 现有面值为1, 2, 5, 10的零钱,问把100元兑换成零钱有多少种方法. 分析: 使用递归的方式,考虑有用m种面值(d[m])兑换n元,则对于每种面值都有两种方式,即换或者不换,则有 f(n, m) = f(n, m - 1) + f(n - d[m - 1], m)—>(不兑换当前面值和兑换当前面值).#include <iostream>using namespace原创 2016-05-16 11:21:27 · 394 阅读 · 0 评论 -
数组------和为定值的多个数
题目描述; 给定两个整数sum和n,要求在1, 2, 3, …, n中找到所有和为sum的组合. eg: sum = 6, n = 6 1 2 3 4 5 6 输出: 6 5 + 1 4 + 2 3 + 2 + 1 分析: 使用递归的方式考虑,原问题可以分割为在你1, 2 , … , n -1中找和为sum - n的问题(sumOfNumbe原创 2016-05-14 10:43:09 · 1361 阅读 · 0 评论 -
数组------最小的k个数
问题描述: 求数组中的最小k个数。 分析: <1>使用选择排序的方法来快速实现(O(n)),具体来说就是借助快速排序的思想,把数组分为比主元v小的部分s1,和比主元v大的部分s2。 1.若k <= |s1|,则第k小的元素在s1,就递归的对s1进行相同的操作。 2.若k = |s1| + 1,那就表示主元就是第k小的元素,那就结束算法,此时数组的前k个元素就是要找的最原创 2016-06-20 15:32:46 · 240 阅读 · 0 评论