劍指offer計劃5(查詢演算法中等版)---java
阿新 • • 發佈:2021-09-05
1.1、題目1
劍指 Offer 04. 二維陣列中的查詢
1.2、解法
其實就是暴力解法的升級版,從最後一行開始判斷,通過num當前的大小,
如果還是大於目標值則行數-1,若是小於則列數+1
1.3、程式碼
class Solution { public boolean findNumberIn2DArray(int[][] matrix, int target) { if(matrix==null || matrix.length==0 ||matrix[0].length==0){ return false; } int rows = matrix.length,columns = matrix[0].length; int row = 0,column= matrix[0].length-1; while(row<rows && column>=0){ int num=matrix[row][column]; if(num==target) return true; else if(num>target) column--; else row++; } return false; } }
2.1、題目2
劍指 Offer 11. 旋轉陣列的最小數字
2.2、解法
這題題目說明了是旋轉陣列,我個人理解,就是陣列被平移過,
原先是排序好的。這裡我用二分查詢的方法,判斷中間和右邊的值的比較,
若是中間值較大,說明,最小值在右邊,若是中間值較小,說明最小值在左邊。
中間值大時,left變成mid+1,從而達到將二分查詢的範圍縮小到右半部分
中間值小時同理,若是中間值與右邊值相同,right-1。
最終左邊與右邊重合,範圍左邊值。
2.3、程式碼
class Solution { public int minArray(int[] numbers) { int len=numbers.length,left=0,right=len-1; while(left<=right){ int mid = left+(right-left)/2; if(numbers[mid]>numbers[right]){ left=mid+1; }else if(numbers[mid]<numbers[right]){ right=mid; }else right--; } return numbers[left]; } }
3.1、題目3
劍指 Offer 50. 第一個只出現一次的字元
3.2、解法
我這題突發奇想用hashmap來實現該題目,LinkedHashMap可以實現按put的順序取出。
getOrDefault取資料加1,再遍歷得值
3.3、程式碼
class Solution { public char firstUniqChar(String s) { if (s=="") return ' '; char []c = s.toCharArray(); HashMap<Character,Integer> map = new LinkedHashMap<Character,Integer>(); for(char i:c){ map.put(i,map.getOrDefault(i,0)+1); } for (Character key : map.keySet()) { if(map.get(key)==1){ return key; } } return ' '; } }