轉載請聲明源地址
聽說,劍指offer那都是大牛干的活【偷笑】,我也湊個熱鬧,
題目:在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
有三個想法:
1.1 for循環遍歷
1.2 for循環遍歷優化版
2. 騰訊曾經的筆試題目(那個100層扔雞蛋,扔玻璃球,扔......)【下篇博客再寫】。
看到題目的時候,以前做過一維數組查找,一個for循環查找,二維數組要查找的話,一樣,直接使用兩個for循環,時間復雜度是o(n^2),說干就干。
存在的問題:
數組是自增數組,如何查找才時間復雜度才是最低的 ,這是優化的方向,想法2也是基于這個目的。
1.1 for循環遍歷
中心指導思想:遇到相同的文件就退出所有循環,將外循環加上標簽,退出循環時,直接退出標簽循環。
public static boolean Find1(int target, int [][] array) { int lenOfarray=array.length; int lenOfRow=array[0].length; Boolean flag=true; outside: for (int i=0;i<lenOfarray;i++) { for (int j=0;j<lenOfRow;j++) { if (array[i][j]==target) { flag=false; break outside; } } } return !flag; }附:牛客截圖
1.2 for循環遍歷
中心指導思想:遇到相同的文件就退出所有循環,將判斷元素相同的條件加入到 循環判定條件中 ,這樣一旦flag變化,判斷條件也同樣變化。
public static boolean Find2(int target, int [][] array) { int lenOfarray=array.length; int lenOfRow=array[0].length; Boolean flag=true; for (int i=0;flag && i<lenOfarray;i++) { for (int j=0;flag && j<lenOfRow;j++) { if (array[i][j]==target) { flag=false; } } } return !flag; }附:牛客截圖
源代碼:GitHub: https://github.com/johnlee2018/JZoffer.git
新聞熱點
疑難解答