網(wǎng)站開發(fā)數(shù)據(jù)庫(kù)分析模板谷歌官網(wǎng)入口
考察點(diǎn):
考察數(shù)據(jù)結(jié)構(gòu)二維數(shù)組
知識(shí)點(diǎn):
1.java中的數(shù)據(jù)類型分為基本類型和引用類型,數(shù)組屬于引用類型,引用類型的變量中存儲(chǔ)的是地址,該地址指向內(nèi)存中的某個(gè)對(duì)象,參考c中的指針。2.一維數(shù)組定義,初始化,遍歷2.1.先定義后初始化:尤其注意如果只定義沒有初始化那么元素會(huì)被初始化為數(shù)據(jù)類型的默認(rèn)值,int會(huì)被初始化為0,float會(huì)被初始化為0.0,boolean會(huì)被初始化為falseint arr[] = new int[2];arr[0] = 10;2.2.定義的時(shí)候同時(shí)初始化:int arr[] = {1,2};int arr[] = new int[] {1,2};2.3.數(shù)組遍歷2.3.1.for (int i = 0;i < arr.length;i++) {System.out.println(arr[i]);}2.3.2.for (int a : arr) {System.out.println(a);}2.3.3.java標(biāo)準(zhǔn)庫(kù)System.out.println(Arrays.toString(arr));3.二維數(shù)組定義,初始化,遍歷3.1.先定義后初始化int arr[][] = new int[2][3];int brr[] = new int[3];int crr[] = new int[3];arr[0] = brr;arr[1] = crr;注意此時(shí)arr.length = 2,而arr[0].length = 0,arr[1].length = 0;3.2.定義的時(shí)候同時(shí)初始化int arr[][] = {{1,2,3},{4,5,6},{7,8,9}}3.3.數(shù)組的遍歷3.3.1 for (int i = 0;i < arr.length; i++) {for (int j = 0;j<arr[0].length;j++) {System.out.println(arr[i][j]);}}3.3.2.for (int brr[] : arr) {for (int n : brr) {System.out,println(n);}}
題目:
分析:
關(guān)于數(shù)組這個(gè)數(shù)據(jù)結(jié)構(gòu)的考點(diǎn)無非就是數(shù)組遍歷。本題目要求判斷一個(gè)二維數(shù)組中是否含有某一個(gè)數(shù)字,直接遍歷二維數(shù)組也可以滿足需求,但此種解法復(fù)雜度為O(n^2),題目不會(huì)這么簡(jiǎn)單,那延伸一下考察的點(diǎn)無非就是如何提升遍歷的效率,試想一下每次二維數(shù)組一個(gè)循環(huán)只能遍歷掉一個(gè)元素,如果一個(gè)循環(huán)遍歷掉一塊元素的話,那效率就會(huì)極大的提升。仔細(xì)觀察題目,其中設(shè)定了數(shù)組的一些屬性,那么這些屬性的目的大概率就是沖著減少遍歷元素的目的去的。每行每列都是遞增排序,試想如果一行(或者一列)中最大的那個(gè)元素比待查找的元素小,那這個(gè)待查找的值肯定不會(huì)出現(xiàn)在這個(gè)最大元素所在的行(或者列);如果一行(或者一列)中最小的那個(gè)元素比待查找的元素大,那么這個(gè)待查找的值也肯定不會(huì)出現(xiàn)在這個(gè)最小元素所在的行(或者列)。而題目中的這個(gè)二維數(shù)組中左上角和右下角的元素就滿足這樣的特性,因?yàn)樽笊辖窃厥切械淖畲笾盗械淖钚≈?#xff0c;右下角是行的最小值列的最大值,拿左上角舉例,如果該元素比待查找的元素小,那么這個(gè)元素所在的行就可以不用遍歷了,如果該元素比待查找的元素大,那么這個(gè)元素所在的列就可以不用遍歷了。
代碼:
public class Three {public static void main(String [] args) {int arr[][] = {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};System.out.println(find(arr,arr.length,arr[0].length,7));System.out.println(find(arr,arr.length,arr[0].length,71));int brr[][] = new int[0][0];System.out.println(find(brr,brr.length,0,71));int crr[][] = new int[1][0];crr[0] = new int[0];System.out.println(find(crr,crr.length,crr[0].length,71));}public static boolean find(int [][] arr,int rows,int cols,int val) {if (null == arr || arr.length == 0|| (arr.length == 1 && arr[0].length == 0)|| rows <=0 || cols <= 0) {return false;}int row = 0;int col = cols - 1;while (row < rows && col >=0) {if (arr[row][col] == val) {return true;}if (arr[row][col] < val) {row ++;} else {col --;}}return false;}
}