判断一个数组是否存在三个元素为某一定值
来源:互联网 发布:大数据认证考试 编辑:程序博客网 时间:2024/06/06 01:24
最近参加了一个公司的笔试,其中有一道题如下:给定一个array,判断是否存在3个元素的和为0?
最开始看到这题没有细想特别优化的方法,居然直接采用了暴力搜索((⊙﹏⊙)b汗!),直接用了一个三层循环求解,代码如下:
最开始看到这题没有细想特别优化的方法,居然直接采用了暴力搜索((⊙﹏⊙)b汗!),直接用了一个三层循环求解,代码如下:
bool judge(int *arr,int n){for(int i = 0;i<n-2;++i){for(int j = i+1;j<n-1;++j){for(int k = j+1;k<n;++k)if(arr[i]+arr[j]+arr[k]==0)return true;}}return false;}
很显然这样的方法是不推荐的,复杂度太高。
改进1:首先对原数组进行排序,再用两层for循环固定前面两个数,然后第三个数用和减去前面2个数,最后采用二分查找的方法检查是否存在。该方法的复杂度为O(n^2*log(n))。
改进2:首先对原数组进行排序,除去一个固定的数字之后剩下两个数字,然后用两个指向数组的指针,一个从前往后扫描,一个从后往前扫描,记为first和last,如果 fist + last < sum 则将fist向前移动,如果fist + last > sum,则last向后移动。该方法的复杂度为O(n^2)。代码如下:
#include <iostream> #include <algorithm> using namespace std; void printPairSums(int data[], int size, int sum) { int first = 0; int last = size -1; int s = 0; while (first < last) { s = data[first] + data[last]; if (s == sum) { cout << data[first] << " + " << data[last] << " = " << sum << endl; first++; last--; } else if (s < sum) first++; else last--; } } int main(int argc, char* argv[]) { int data[] = {1, 5, 9, -1, 4, 6, -2, 3, -8}; int size = sizeof(data) / sizeof(data[0]); int i; sort(data, data + size); printPairSums(data, size, 8); system("pause"); return 0; }
改进3:采用回溯法。代码如下:
#include <iostream> #include <algorithm> using namespace std; const int S = 22; int sumCheck(int A[], int start, int end, int arr[], int cnt){ if (cnt == 2){ int sum = arr[0] + arr[1] + arr[2]; if (sum == S) cout << arr[0] << "\t" << arr[1] << "\t" << arr[2] << endl; return 0; } if (start > end || cnt > 2) return -1; int i = start; arr[++cnt] = A[i]; sumCheck(A, start + 1, end, arr, cnt); arr[cnt] = 0; cnt--; sumCheck(A, start + 1, end, arr, cnt); } int main(int argc, char* argv[]) { int A[] = {1, 4, 45, 6, 10, 8}; int arr_size = sizeof(A) / sizeof(A[0]); int cnt = -1; int arr[3] = {0, 0, 0}; sumCheck(A,0, arr_size-1, arr, cnt); system("pause"); return 0; }
问题的推广可参考博客求数组中多个数相加等于某一值以及面试题:检查一个数组里是否存在m个数的和等于某个值。
0 0
- 判断一个数组是否存在三个元素为某一定值
- 两个数组判断某一元素是否存在
- 判断数组中是否存在某一元素
- 判断一个int数组中的元素是否存在重复
- js判断一个对象数组里是否存在某个元素
- 判断一个int数组中的元素是否存在重复
- js判断一个对象数组里是否存在某个元素
- 判断控件数组中的元素是否存在
- 判断数组是否存在某元素
- 如何判断数组是否存在重复元素
- 判断元素是否为空,是否存在,元素值=sss,y元素值包含aa
- js 判断一个元素是否存在
- 一个长度为N的整形数组,数组中每个元素的取值范围是[0,N-1],写一个算法判断数组中是否存在重复的数字
- 判断某一文件是否存在
- 如何在前端用js判断一个元素在一个数组中是否存在
- 二分查找法及判断一个数组中是否有两个元素之和为指定值
- js判断某值是否存在于某一array数组中
- js判断元素是否为空,是否存在
- CentOS 7.2 team实现网卡聚合链路(双网卡绑定)脚本及验证
- C#之类继承,接口学习案例
- javascript 获取时间
- c++智能指针
- 菊花转:UIActivityIndicatorView
- 判断一个数组是否存在三个元素为某一定值
- unity android APK打包
- Jquery的使用第一部分
- 【NOIP2016提高A组模拟9.2】同余
- POJ 1741 点分治
- ubuntu安装sublime详细教程
- 函数的定义方式 及 函数的形参与实参
- 用户和组相关配置文件
- Lexicographical Numbers