YTUOJ-在数组中查找数字【数组】

Description

给定整型数组B[0..m,0..n] 。已知B中数据在每一维方向上都按从小到大的次序排列,且整型变量x在B中存在。试设计一个程序段找出一对满足B[i,j]=x的(i,j)值,要求比较次数不超过m+n.

Input

数组长,宽

数组各元素的值

变量x

Output

输出所有的i,j对

Sample Input

5 4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
17 18 19 20
1

Sample Output

1 1

HINT

X在B中也许并不只一个,多组数据按行优先策略

代码如下:

#include <iostream>
using namespace std;
int main()
{
    int m,n,i,j,a[20][20],num;
    while (cin>>m>>n)
    {
        for (i=0; i<m; ++i)
            for (j=0; j<n; ++j)
                cin>>a[i][j];
        cin>>num;
        i=0,j=n-1;
        while (i<m&&j>=0)
        {
            if (a[i][j]==num)
            {
                 cout<<i+1<<" "<<j+1<<endl;
                 i++;
            }
            else if (a[i][j]>num)
                j--;
            else
                i++;
        }
    }
    return 0;

}

运行结果:

学习心得:

很久没有静心做题了,,,中午看到这道题,来了兴趣。

题目要求时间复杂度不能超过m+n,所以一般的二重循环是肯定不行的,但题目中说输入的数据每一维(x,y方向上都是)是按照从小到大的顺序排列的,所以我们可以从右上角按照当前位置与输要查找的那个数的情况分别向左、向下找询。如结果所示。

时间: 2024-11-08 18:03:23

YTUOJ-在数组中查找数字【数组】的相关文章

C语言编程 在杨氏数组中查找数字

题目:杨氏矩阵(一个二维数组,数组的每行从左到右是递增的,每列从上到下是递增的)在这样的数组中查找一个数字是否存在.要求时间复杂度小于O(N); 主要思路:题目要求时间复杂度度不能大于O(N),所以判断次数必须小于遍历一次数组次数.所以从数组的右上角开始判断,若当前元素大于要查找的数字,则跳过当前列查询下一列,若当前元素小于要查找的数,则跳过当前行查找下一行,直至找到或者找不到. eg:此处使用数组arr[3][3]={1,2,3,4,5,6,7,8,9}:1 2 34 5 67 8 9在数组中

【剑指Offer】面试题53 - I. 在排序数组中查找数字 I

题目 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 示例?2: 输入: nums = [5,7,7,8,8,10], target = 6 输出: 0 限制:0 <= 数组长度 <= 50000 本题同[LeetCode]34. 在排序数组中查找元素的第一个和最后一个位置 思路 代码 时间复杂度:O(logn) 空间复杂度:O(1) class Solution { public: int search

[剑指Offer]53-在排序数组中查找数字(二分查找)

题目一 数字在排序数组中出现的个数 题目描述 统计一个数字在排序数组中出现的次数. 解决思路 写两个二分查找分别找第一个和最后一个该数字,然后可直接出计算有几个该数字.时间复杂度为O(logn). 这里使用二分查找的递归写法,形式可以写得更简洁(见书). 当输入不符合规则返回-1.注意形参len表示原始数组的长度,在此题目中是必要的.注意特殊输入的处理. 代码 #include <iostream> using namespace std; int findFirstK(int* num,in

剑指offer:在排序数组中查找数字

题目: 统计一个数字在排序数组中出现的次数. 例如输入排序数组{1,2,3,3,3,3,4,5},由于3在这个数中出现了4次,输出4. # -*- coding: utf-8 -*- # @Time : 2019-07-13 15:10 # @Author : Jayce Wong # @ProjectName : job # @FileName : getNumberOfK.py # @Blog : https://blog.51cto.com/jayce1111 # @Github : ht

53-1-在排序数组中查找数字

题目:数字在排序数组中出现的次数.输入为一个排序数组和一个数字. def get_first_num(nums,k,start,end): if start>end: return -1 mid = (end+start)//2 if nums[mid]==k: if mid==0 or (mid>0 and nums[mid-1]!=k): return mid else: end = mid-1 elif nums[mid]>k: end = mid-1 else: start =

[LeetCode]面试题53 - I. 在排序数组中查找数字 I(二分)

题目 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 示例?2: 输入: nums = [5,7,7,8,8,10], target = 6 输出: 0 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明

剑指offer——56在排序数组中查找数字

题目描述 统计一个数字在排序数组中出现的次数. 题解: 使用二分法找到数k然后向前找到第一个k,向后找到最后一个k,即可知道有几个k了 但一旦n个数都是k时,这个方法跟从头遍历没区别,都是O(N)的复杂度 可以再次利用二分法,在第一次找到k的左半部分使用二分法找到不再出现k的位置,其右半部份类似. 1 class Solution01 { 2 public: 3 int GetNumberOfK(vector<int> data, int k) { 4 if (data.size() == 0

【LeetCode】34. 在排序数组中查找元素的第一个和最后一个位置

题目 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是?O(log n) 级别. 如果数组中不存在目标值,返回?[-1, -1]. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: [3,4] 示例?2: 输入: nums = [5,7,7,8,8,10], target = 6 输出: [-1,-1] 本题同[剑指Offer]面试题53 - I. 在排序数组

输入一个有序数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字

输入一个有序数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字.如果有多对数字的和等于输入的数字,输出任意一对即可.例如输入数组1.2.4.7.11.15和数字15.由于4+11=15,因此输出4和11. 1 #include<stdio.h> 2 #include<stdlib.h> 3 4 void findTwo(int *array, int len, int sum) 5 { 6 int beg = 0; 7 int end = len-1; 8 int