行列有序数组求给定数是否存在
2013-08-14 09:34
148 查看
沿对角线二分,并对独行独列进行优化
输入示例:
样例输入:
样例输出:
输入示例:
样例输入:
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; }
相关文章推荐
- 行列有序数组求给定数是否存在
- 判断有序整型数组中是否存在两数,相加之和等于给定的任意整数
- 在一个循环有序数组里查找一个给定的值是否存在
- 给定一个数组和一个数字,给定的数组里是否存在两个数字之和等于给定的数字
- 【41】递增数组判断是否存在两个树等于给定值
- N个元素的有序数组A,判断是否有 A[i]=i 存在
- 【41】递增数组判断是否存在两个树等于给定值
- 在行列分别有序的二维矩阵中查找是否有给定值
- 【41】递增数组判断是否存在两个树等于给定值
- 【41】递增数组判断是否存在两个树等于给定值
- 判断数组中是否存在两数之和为给定值
- leetcode-java.T015_3Sum---给定一个n个元素的数组,是否存在a,b,c三个元素,使用得a+b+c=0,找出所有符合这个条件的三元组
- 给定一个数组,从中查找是否存在两个数的和等于一个给定的x
- PHP 检查给定的键名或索引是否存在于数组中 array_key_exists 函数
- 给定一个n个整数的数组S,是否存在S中的4个数,使得a + b + c + d = target。 在数组中找出所有唯一的四元组,给出目标的总和。
- 有序整型数组A,判断A中是否存在两个数之和等于X,时间O(n)
- 给定排好序的数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X
- 判断二叉树是否平衡、求二叉树的镜像、按行列有序矩阵中快速查找元素是否存在
- 在一个二维有序数组中,查找指定的数据是否存在
- 给定一个经过一次旋转的有序数组,从中查找一个值,若存在返回它的索引,不存在返回-1