牛客网C++编程题(一) 二维数组中的查找

来源:互联网 发布:interrupt用法c语言 编辑:程序博客网 时间:2024/06/05 21:51

题目描述

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

class Solution {public:    bool Find(int target, vector<vector<int> > array) {      // TDDO:}

解题思路

  • 此题不适用于使用二分法,因为数组并不是严格有序的数组
  • 观察题干,可知数组最左侧的元素是关键,因为从最左列元素出发,向左遍历和向下遍历都是依次增大的(其实数组中的每个元素都有这个特性,下述就依照这个特性进行判断)
  • 假设数组为m*n,所以可以使用左下角元素值array[m-1][n-1]当前元素值(记为a)出发,进行判断:

  1. 若a大于目标值(记为A),则a所在的行其它元素不满足比对条件(因为一定比A大),此时只需将a的行值rows-1,然后再将所在的元素值与A比较...若a小于A,则按2处理
  2. 如果a小于A,则增加a的列数cols+1,若a大于A,则按1处理
  3. 程序在步骤1、2中循环
  4. 跳出条件——列数大于数组宽度,行数小于0

代码

// Summary: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。//          请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数// Author: Amusi// Date:   2017-10-27// Reference: https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e?tpId=13&tqId=11154&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking#include <iostream>#include <vector>using namespace std;// 函数申明bool Find(int target, vector<vector<int> > array);int main(){vector<vector<int>> arraySum;vector<int>  array1;vector<int>  array2;vector<int>  array3;vector<int>  array4;// 测试数据// colsfor (int i = 0; i < 10; ++i){array1.push_back(i);}for (int i = 10; i < 20; ++i){array2.push_back(i);}for (int i = 20; i < 30; ++i){array3.push_back(i);}for (int i = 30; i < 40; ++i){array4.push_back(i);}// rowsarraySum.push_back(array1);arraySum.push_back(array2);arraySum.push_back(array3);arraySum.push_back(array4);// 调用缩写函数bool flag = Find(25, arraySum);if (flag)cout << "find..."<< endl;elsecout <<"Not find..." << endl;return 0;}bool Find(int target, vector<vector<int> > array) {int m = array.size();int n = array[0].size();int rows = m - 1;int cols = 0;if (m == 0 && n == 0)return false;while (rows >= 0 && cols < n){if (target < array[rows][cols]){--rows;}else if (target > array[rows][cols]){++cols;}elsereturn true;}return false;}

总结

审题极为重要,理解了题目信息,对解题事半功倍