有序数组的查找
一维递增数组二分查找
题目
题目地址
描述
请实现无重复数字的升序数组的二分查找
给定一个 元素升序的、无重复数字的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标(下标从 0 开始),否则返回 -1
分析
二分查找的前提是数组是严格递增的,这样使用上下界法就可以,不断缩小范围。
实现
import java.util.*;
public class Solution {
public int search (int[] nums, int target) {
int l = 0;
int r = nums.length - 1;
//从数组首尾开始,直到二者相遇
while(l <= r){
//每次检查中点的值
int m = (l + r) / 2;
if(nums[m] == target)
return m;
//进入左的区间
if(nums[m] > target)
r = m - 1;
//进入右区间
else
l = m + 1;
}
//未找到
return -1;
}
}
二维数组中的查找
题目
题目地址
描述
在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
给定 target = 7,返回 true。
给定 target = 3,返回 false。
分析
查找问题最简单,直接循环,但是这不是这道题的本意。
我们分析一下,这个数组是有规律的,每个元素它上面比它小,右边比它大。 我们按照二分的思想去看,对角线上的元素比较特殊,右上角的元素,它左边比自己小,下面比自己大,它类似于中间角色;左下角也是这样一个中间角色。
所以我么可以以左下角为起点进行遍历,也可以以右上角为起点。
代码实现
以左下角为起点开始遍历
public class Solution {
public boolean Find(int target, int [][] array) {
int m = array.length;
int n = array[0].length;
if(m*n == 0) return false;
for(int i = m-1, j =0; i>=0 && j<n;) {
if(target == array[i][j] ) return true;
if(target < array[i][j])
i--;
else
j++;
}
return false;
}
}
以右上角为起点开始遍历
public class Solution {
public boolean Find(int target, int [][] array) {
int m = array.length;
int n = array[0].length;
if(m*n == 0) return false;
for(int i = 0, j =n-1; j>=0 && i<m;) {
if(target == array[i][j] ) return true;
if(target < array[i][j])
j--;
else
i++;
}
return false;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!