当前位置:   article > 正文

判断一个数组是否存在三个元素为某一定值_给定一个数组判断是否存在3个元素和为0的元素

给定一个数组判断是否存在3个元素和为0的元素
最近参加了一个公司的笔试,其中有一道题如下:给定一个array,判断是否存在3个元素的和为0?
最开始看到这题没有细想特别优化的方法,居然直接采用了暴力搜索((⊙﹏⊙)b汗!),直接用了一个三层循环求解,代码如下:

  1. bool judge(int *arr,int n){
  2. for(int i = 0;i<n-2;++i){
  3. for(int j = i+1;j<n-1;++j){
  4. for(int k = j+1;k<n;++k)
  5. if(arr[i]+arr[j]+arr[k]==0)
  6. return true;
  7. }
  8. }
  9. return false;
  10. }

很显然这样的方法是不推荐的,复杂度太高。

改进1:首先对原数组进行排序,再用两层for循环固定前面两个数,然后第三个数用和减去前面2个数,最后采用二分查找的方法检查是否存在。该方法的复杂度为O(n^2*log(n))。

改进2:首先对原数组进行排序,除去一个固定的数字之后剩下两个数字,然后用两个指向数组的指针,一个从前往后扫描,一个从后往前扫描,记为first和last,如果 fist + last < sum 则将fist向前移动,如果fist + last > sum,则last向后移动。该方法的复杂度为O(n^2)。代码如下:

  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4. void printPairSums(int data[], int size, int sum)
  5. {
  6. int first = 0;
  7. int last = size -1;
  8. int s = 0;
  9. while (first < last)
  10. {
  11. s = data[first] + data[last];
  12. if (s == sum)
  13. {
  14. cout << data[first] << " + " << data[last] << " = " << sum << endl;
  15. first++;
  16. last--;
  17. }
  18. else if (s < sum)
  19. first++;
  20. else
  21. last--;
  22. }
  23. }
  24. int main(int argc, char* argv[])
  25. {
  26. int data[] = {1, 5, 9, -1, 4, 6, -2, 3, -8};
  27. int size = sizeof(data) / sizeof(data[0]);
  28. int i;
  29. sort(data, data + size);
  30. printPairSums(data, size, 8);
  31. system("pause");
  32. return 0;
  33. }

改进3:采用回溯法。代码如下:

  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4. const int S = 22;
  5. int sumCheck(int A[], int start, int end, int arr[], int cnt){
  6. if (cnt == 2){
  7. int sum = arr[0] + arr[1] + arr[2];
  8. if (sum == S)
  9. cout << arr[0] << "\t" << arr[1] << "\t" << arr[2] << endl;
  10. return 0;
  11. }
  12. if (start > end || cnt > 2)
  13. return -1;
  14. int i = start;
  15. arr[++cnt] = A[i];
  16. sumCheck(A, start + 1, end, arr, cnt);
  17. arr[cnt] = 0;
  18. cnt--;
  19. sumCheck(A, start + 1, end, arr, cnt);
  20. }
  21. int main(int argc, char* argv[])
  22. {
  23. int A[] = {1, 4, 45, 6, 10, 8};
  24. int arr_size = sizeof(A) / sizeof(A[0]);
  25. int cnt = -1;
  26. int arr[3] = {0, 0, 0};
  27. sumCheck(A,0, arr_size-1, arr, cnt);
  28. system("pause");
  29. return 0;
  30. }

问题的推广可参考博客求数组中多个数相加等于某一值以及面试题:检查一个数组里是否存在m个数的和等于某个值

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/366096
推荐阅读
相关标签
  

闽ICP备14008679号