c++ 找数组中两个元素,其和等于固定值sum,并输出
来源:互联网 发布:linux mv 文件夹 覆盖 编辑:程序博客网 时间:2024/06/08 07:08
周二去中兴面试的,笔试题做的是选择填空,加一道编程题。
编程题求得是数组中两个元素,求和等于固定值sum。
这题最简单的方法当然是采用双重循环,进行遍历。但是这种方法的效率无疑是比较低的。复杂度是O(n^2)。
所以我就从另外一个角度进行分析:1. 先对数组进行排序;2. 在排序数组的基础之上,对数组进行遍历。通过分步的方法,可以有效地提高效率。下面进行详细分析。
一,首先讲得是排序算法,有很多种,当然我们要找效率最高的一种,最有效的排序算法可以将复杂度降到O(n),但是需要O(n)的辅助空间,这种算法在数组很大的时候,不适合使用;另外就考虑比较好的排序算法,如快速排序,复杂度可以降低到O(nlogn)。
二、其次就是在数组排序之后,如何找到和为固定值sum的两个数。通过分析,可以仅通过遍历一次排序后的数组,即可找到所有可能的组合。下面,上代码……
#include <iostream>using namespace std;int arrPartition(int arr[], int low, int high){ int pivotValue = arr[low]; while(low<high) { while(low<high && arr[high]>=pivotValue) high--; swap(arr[low],arr[high]); while(low<high && arr[low]<=pivotValue) low++; swap(arr[low],arr[high]); } return low;}void quickSort(int arr[], int low, int high){ if(low<high) { int pivotIndex = arrPartition(arr,low,high); quickSort(arr,low,pivotIndex-1); quickSort(arr,pivotIndex+1,high); }}void dualSum(int arr[], int len, int sum){ int low=0; int high=len-1; while(low<high) { while(arr[high]>=sum) { high--; } if(arr[low]+arr[high]>sum) return; else if(arr[low]+arr[high]<sum) low++; else { cout << arr[low] << " + " << arr[high] << " = " << sum << endl; high--;low++; } }}int main(){ int arr[] = {5,2,7,4,21,6,14,12,11,24,26,13,30}; int arr2[] = {2,4,5,6,7,11,12,13,14,21,24,26,30}; quickSort(arr,0,12); for(int i=0;i<13;i++) cout << arr2[i] << " "; cout << endl; dualSum(arr2,13,28); dualSum(arr,13,28); return 0;}
通过对以上代码分析,可以计算出整个算法的复杂度:
排序算法的复杂度是O(nlogn),dualSum()函数的代码虽然有两个while循环,但对数组仅进行了一次遍历,其复杂度为O(n)。
由此可见,复杂度为O(nlogn)。
阅读全文
1 0
- c++ 找数组中两个元素,其和等于固定值sum,并输出
- 从数组中找出两个元素的和等于指定数值,并输出位置。
- Two sum(在数组中找两个数,使其和为指定值)
- 【100题】第十四题(数组中找两个数使其和等于输入数)
- 数组中找两个数使其和等于输入数
- Two Sum(找出数组中两个和等于指定数字的元素)
- 1.无序数组中找出两个数使其和等于给定值
- 定义一个10元素的数组,给其赋值,每个值等于其下标,输出;然后倒排序再输出
- 判断集合S中是否存在两个其和等于x的元素
- 算法入门---判断集合S中是否存在两个其和等于x的元素
- 算法入门---判断集合S中是否存在两个其和等于x的元素
- 在排序数组中寻找两个数使其和等于给定数
- 【算法题】数组中找到两个数,使其和等于某个数
- 从数组中找出其和等于S的两个数
- 数组中寻找和为sum的两个元素
- 快速找出一个数组中的两个数字,其和等于给定值。
- Two Sum 数组中找两个之和为sum@LeetCode
- 算法学习笔记----判断集合S中是否存在有两个其和等于x的元素
- 深度置信网络(Deep belief network)matlab初解
- javaScript 原型对象与原型链
- 笨办法学 Python · 续 练习 30:有限状态机
- STL容器 set、 multiset、map、multimap
- 第五篇:JAVA之面向对象(中)
- c++ 找数组中两个元素,其和等于固定值sum,并输出
- hdu-2047阿牛的EOF牛肉串
- HDU 2859
- jsp中在option里面写<c:if></c:if>代码报错解决方案
- Entity Framework数据库初始化四种策略
- Linux之文件系统
- 网站优化三步走,流量转化全都有
- 变量、数据类型和运算符
- javascript 基础(三)--BOM