行列有序数组求给定数是否存在
2013-08-14 18:16
162 查看
沿对角线二分,并对独行独列进行优化
输入示例:
样例输入:
样例输出:
输入示例:
样例输入:
3 3 5 1 2 3 4 5 6 7 8 9 3 3 1 2 3 4 5 6 7 8 9 10 3 3 12 2 3 4 5 6 7 8 9 10
样例输出:
Yes No No
#include <iostream> #include <algorithm> #include <stdio.h> using namespace std; const int kMaxM = 1000; const int kMaxN = 1000; int array[kMaxM][kMaxN] = {0}; int m, n, k; bool IsExists(int x1, int y1, int x2, int y2) { // cout << x1 << " " << y1 << " " << x2 << " " << y2 << endl; int factx = 1, facty = 1, h = min(x2 - x1, y2 - y1); if (x1 == x2) { factx = 0; facty = 1; h = y2 - y1; } else if (y1 == y2) { factx = 1; facty = 0; h = x2 - x1; } int l = 0, mid = 0; bool found = false; while (l <= h) { mid = (l + h ) / 2; if (array[x1 + factx * mid][y1 + facty * mid] > k) { h = mid - 1; } else if (array[x1 + factx * mid][y1 + facty * mid] == k) { return true; } else { l = mid + 1; } } if (h < 0) { return false; } if (y1 + h + 1 <= n - 1) { if (IsExists(x1, y1 + h + 1, x1 + h, y2)) { return true; } } if (x1 + h + 1 <= m - 1) { if (IsExists(x1 + h + 1, y1, x2, y1 + h)) { return true; } } return false; } int main() { while (scanf("%d %d", &m, &n) != EOF) { scanf("%d", &k); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { scanf("%d", &array[i][j]); } } if (IsExists(0, 0, m - 1, n - 1)) { printf("Yes\n"); } else { printf("No\n"); } } return 0; }
相关文章推荐
- 行列有序数组求给定数是否存在
- 判断有序整型数组中是否存在两数,相加之和等于给定的任意整数
- 在一个循环有序数组里查找一个给定的值是否存在
- PHP 检查给定的键名或索引是否存在于数组中 array_key_exists 函数
- 有序整型数组A,判断A中是否存在两个数之和等于X,时间O(n)
- leetcode-java.T015_3Sum---给定一个n个元素的数组,是否存在a,b,c三个元素,使用得a+b+c=0,找出所有符合这个条件的三元组
- 给定排好序的数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X
- 在一个二维有序数组中,查找指定的数据是否存在
- php-Arrays 函数-array_key_exists-检查给定的键名或索引是否存在于数组中
- 查找一个数是否存在于一个数组中。该数组分两段有序,第一段的数都大于第二段的数。
- 给定一个n个整数的数组S,是否存在S中的4个数,使得a + b + c + d = target。 在数组中找出所有唯一的四元组,给出目标的总和。
- 判断一个有序数组中是否有两个数的和等于给定的数
- 十六周——判断两个有序数组中是否存在相同的数字
- 求一个值是否是一个给定有序数组中两个元素的和
- 判断二叉树是否平衡、求二叉树的镜像、按行列有序矩阵中快速查找元素是否存在
- 程序员面试题目总结--数组(二)【二分查找、找出给定数字出现次数、两个有序整型数组交集、找出数组中唯一的重复元素、判断数组中的数值是否连续相邻】
- 判断两个有序数组中是否存在相同的数字
- 判断两个有序数组中是否存在相同的数字
- 【指针】16周项目四。判断两个有序数组中是否存在相同的数字
- 给定一个经过一次旋转的有序数组,从中查找一个值,若存在返回它的索引,不存在返回-1