二維陣列中的查詢——牛客劍指offer
題目描述:
在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。
輸入引數:target(查詢值) array(二維陣列)
解題思路:
1、python程式碼
python實現比較簡單,使用for in迴圈取出陣列的每行i,然後使用in操作符判斷target是否在行i中
# -*- coding:utf-8 -*-
class Solution:
# array 二維列表
def Find(self, target, array):
# write code here
for i in array:
if target in i:
return True
return False
2、java程式碼
我們先看一個符合題目要求的陣列
演算法(遞迴):
m:行數 n:列數
(1)遍歷最後一行(rowindex=m-1),找到第一個大於target的元素,儲存其列索引colindex
(2)向上搜尋:find(rowindex,colindex,"up",target,array)
(2)遞迴
a.當前操作為向上搜尋(direction='up'):
如果rowindex==0:已經搜尋至第一行,無解,返回false
否則,rowindex-=1
b.當前操作為向右搜尋(direction='right'):
如果colindex==n-1:已經搜尋至最後一列,無解,返回false
否則,colindex+=1
a.如果array[rowindex][colindex]==target:返回true
b.如果array[rowindex][colindex]>target:向上搜尋find(rowindex,colindex,"up",target,array)
c.如果array[rowindex][colindex]<target:向右搜尋find(rowindex,colindex,"right",target,array)
按照如上演算法和陣列,舉例說明,搜尋元素12步驟如下:
(1)m=4,n=4.最後一行第一個大於12的元素為13,儲存其行列索引,rowindex=3,colindex=2
(根據數值大小排列的特點,可以排除掉第一列和第二列的所有元素)
(2)向上搜尋:find(rowindex=3,colindex=2,direction="up",target=11,array)
(3)遞迴:
向上搜尋:rowindex=2,colindex=2,10<12:向右搜尋
向右搜尋:rowindex=2,colindex=3,13>12:向上搜尋
向上搜尋:rowindex=1,colindex=3,12=12:停止搜尋,返回true
程式碼如下:
public class Solution {
public boolean Find(int target, int [][] array) {
int m=array.length;
int n=array[0].length;
int colindex=-1;
int rowindex=m-1;
for(int i=0;i<n;i++){
if(array[m-1][i]>target){
colindex=i;
break;
}
else if (array[m-1][i]==target){
return true;
}
}
if(colindex==-1){
return false;
}
else{
return find(rowindex,colindex,"up",target,array);
}
}
public boolean find(int rowindex,int colindex,String direction,int target, int [][] array){
if(direction=="up"){
if(rowindex==0){
return false;
}
else{
rowindex--;
}
}
else if(direction=="right"){
if(colindex==array[0].length-1){
return false;
}
else{
colindex++;
}
}
if(array[rowindex][colindex]<target){
return find(rowindex,colindex,"right",target,array);
}
else if(array[rowindex][colindex]>target){
return find(rowindex,colindex,"up",target,array);
}
else{
return true;
}
}
//測試程式碼
// public static void main(String[]args){
// int array1[][]={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
// Solution sol=new Solution();
// boolean a=sol.Find(14,array1);
// System.out.println(a);
// }
}
相關文章
- 【劍指offer】二維陣列中的查詢陣列
- 【劍指offer】【1】二維陣列中的查詢陣列
- 劍指 Offer 04. 二維陣列中的查詢陣列
- 劍指 offer 第一題: 二維陣列中的查詢陣列
- nowcoder-劍指offer-二維陣列的查詢陣列
- 劍指Offer積累-JZ1-二維陣列中的查詢陣列
- 劍指offer刷題記錄_2. 二維陣列中的查詢陣列
- 1. 二位陣列中的查詢(劍指offer)陣列
- offer通過--3二維陣列中查詢-2陣列
- 二維陣列中的查詢陣列
- 0二分查詢簡單 牛客NC.71旋轉陣列的最小數字 leetcode劍指 Offer 11. 旋轉陣列的最小數字陣列LeetCode
- 【JZOF】二維陣列中的查詢陣列
- 二維陣列查詢陣列
- 劍指 offer(1) -- 陣列篇陣列
- 劍指Offer-37-陣列中逆序對陣列
- 每日一題 - 劍指 Offer 53 - I. 在排序陣列中查詢數字 I每日一題排序陣列
- 劍指Offer--陣列中重複的數字陣列
- 劍指offer——陣列中的逆序對C++(75%)陣列C++
- 劍指offer面試題12:矩陣中的路徑(Java版已在牛客網AC)面試題矩陣Java
- 劍指offer面試題11:旋轉陣列的最小數字(Java版已在牛客網AC)面試題陣列Java
- 劍指Offer-連續子陣列中的最大和陣列
- 劍指offer之順序列印陣列陣列
- 劍指offer:旋轉陣列的最小數字陣列
- 劍指offer 旋轉陣列的最小數字陣列
- Leetcode 劍指 Offer 03. 陣列中重複的數字LeetCode陣列
- 劍指offer(java實現)第4題“重建二叉樹”-牛客網Java二叉樹
- 指標陣列和陣列指標與二維陣列指標陣列
- 劍指offer-轉陣列的最小數字-php陣列PHP
- 劍指Offer-34-把陣列排成最小的數陣列
- 劍指offer——把陣列排成最小的數C++陣列C++
- 劍指Offer-把陣列中的數排成一個最小的數陣列
- 劍指offer刷題之路--1.陣列中重複的數字陣列
- 劍指 Offer 56 - I. 陣列中數字出現的次數陣列
- 【劍指offer】7.旋轉陣列的最小數字陣列
- 【劍指 Offer】11. 旋轉陣列的最小數字陣列
- 劍指 Offer 42.連續子陣列的最大和陣列
- 劍指 Offer 11. 旋轉陣列的最小數字陣列
- 二維陣列與指標陣列指標