1.1、題目1

劍指 Offer 04. 二維陣列中的查詢

1.2、解法

其實就是暴力解法的升級版,從最後一行開始判斷,通過num當前的大小,

如果還是大於目標值則行數-1,若是小於則列數+1

1.3、程式碼

  1. class Solution {
  2. public boolean findNumberIn2DArray(int[][] matrix, int target) {
  3. if(matrix==null || matrix.length==0 ||matrix[0].length==0){
  4. return false;
  5. }
  6. int rows = matrix.length,columns = matrix[0].length;
  7. int row = 0,column= matrix[0].length-1;
  8. while(row<rows && column>=0){
  9. int num=matrix[row][column];
  10. if(num==target) return true;
  11. else if(num>target) column--;
  12. else row++;
  13. }
  14. return false;
  15. }
  16. }

2.1、題目2

劍指 Offer 11. 旋轉陣列的最小數字

2.2、解法

這題題目說明了是旋轉陣列,我個人理解,就是陣列被平移過,

原先是排序好的。這裡我用二分查詢的方法,判斷中間和右邊的值的比較,

若是中間值較大,說明,最小值在右邊,若是中間值較小,說明最小值在左邊。

中間值大時,left變成mid+1,從而達到將二分查詢的範圍縮小到右半部分

中間值小時同理,若是中間值與右邊值相同,right-1。

最終左邊與右邊重合,範圍左邊值。

2.3、程式碼

  1. class Solution {
  2. public int minArray(int[] numbers) {
  3. int len=numbers.length,left=0,right=len-1;
  4. while(left<=right){
  5. int mid = left+(right-left)/2;
  6. if(numbers[mid]>numbers[right]){
  7. left=mid+1;
  8. }else if(numbers[mid]<numbers[right]){
  9. right=mid;
  10. }else right--;
  11. }
  12. return numbers[left];
  13. }
  14. }

3.1、題目3

劍指 Offer 50. 第一個只出現一次的字元

3.2、解法

我這題突發奇想用hashmap來實現該題目,LinkedHashMap可以實現按put的順序取出。

getOrDefault取資料加1,再遍歷得值

3.3、程式碼

  1. class Solution {
  2. public char firstUniqChar(String s) {
  3. if (s=="") return ' ';
  4. char []c = s.toCharArray();
  5. HashMap<Character,Integer> map = new LinkedHashMap<Character,Integer>();
  6. for(char i:c){
  7. map.put(i,map.getOrDefault(i,0)+1);
  8. }
  9. for (Character key : map.keySet()) {
  10. if(map.get(key)==1){
  11. return key;
  12. }
  13. }
  14. return ' ';
  15. }
  16. }