JZ4 二维数组中的查找

题目描述

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

[

[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]

]

给定 target = 7,返回 true。

给定 target = 3,返回 false。

数据范围:矩阵的长宽满足 0≤n,m≤500 , 矩阵中的值满足 0≤val≤109
进阶:空间复杂度 O(1) ,时间复杂度 O(n+m)

示例1

输入:

7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]

输出:

true

示例2

输入:

3,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]

输出:

false

题解:

此题可以使用暴力解法,双循环遍历数组查找目标值

但是由于此题为一个升序数组,那么我们可以使用二分查找。比如说此题可以先找到中间值 mid,他的下标为 index ,初始设定左边界为数组第一个数 left=0 ,右边界为数组长度 right=length-1 ,一定要在left小于等于right进入循环,这样目标值在最后一个的时候就也能找到。如果mid等于k的值,那么就直接返回true说明找到了。如果这个 mid 是大于k的,那么这个 mid 右边的数都是大于k,就让 right=index-1 ;否则就是 mid 小于 k,那么mid左边都是全小于k,那么就让left=index+1。循环外的返回值为false,说明没找到。

二分查找:

  1. 二分查找用于查找的内容逻辑上是需要有序的
  2. 查找的数量为一个而不是多个

对于满足这样的条件的我们可以使用二分查找。二分查找的思想就是用我们需要查找的值跟数组的 中间值去比较。

  1. 如果相等直接返回答案
  2. 如果不相等
  •         如果中间的值大于目标值,则中间向右的值都大于目标值,全部排除
  •         如果中间的值小于目标值,则中间向左的值都小于目标值,全部排除
public class Solution {
    public static void main(String[] args) {
        //Scanner scanner = new Scanner(System.in);
        Solution s = new Solution();
        int [][] arr = {{1,2,8,9},{2,4,9,12}};
        System.out.println(s.Find(12,arr));
    }
    public boolean Find(int target,int[][] array){
        for (int i = 0 ;i<array.length;i++){
            if (binarySearch(array[i],target)){
                return true;
            }
        }
        return false;
    }

    public boolean binarySearch(int []arr,int k){
        int left = 0;
        int right = arr.length - 1;
        while(left <= right){
            int mid = (left + right) / 2;
            if (arr[mid] == k) return true;
            else if (arr[mid] > k) right = mid - 1;
            else left = mid + 1;
        }
        return false;
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,问题是关于在一个二维数组查找一个整数的。这个二维数组的特点是每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。给定一个目标整数,要判断数组是否存在该整数。 根据引用的代码,可以使用两个指针i和j来遍历二维数组,从右上角开始。如果当前元素等于目标整数,则返回True;如果当前元素大于目标整数,则向左移动j;如果当前元素小于目标整数,则向下移动i。重复这个过程直到找到目标整数或者遍历完整个数组。如果遍历完整个数组都没有找到目标整数,则返回False。 根据引用的思路1,可以先判断数组是否为空。如果数组为空,则直接返回False。然后遍历每一行,如果当前行的第一个数大于目标整数,则说明该行及其之后的行都不存在目标整数,可以直接退出循环。如果当前行的最后一个数小于目标整数,则说明该行的所有数都比目标整数小,继续查找下一行。否则,在当前行比对查找,如果找到目标整数,则返回True。如果遍历完整个数组都没有找到目标整数,则返回False。 所以,根据以上的方法和思路,可以用以下的代码来实现: ``` class Solution: def Find(self, target, array): if len(array) == 0: return False elif len(array > target: break if array[i][n-1 < target: continue else: for item in array[i]: if item == target: return True return False ``` 这样,就可以通过调用`Solution`类的`Find`方法来判断二维数组是否存在目标整数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [JZ1 二维数组查找 python](https://blog.csdn.net/qq_42187809/article/details/119544063)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [python JZ4 二维数组查找(剑指offer)](https://blog.csdn.net/qq_45894553/article/details/121388712)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值