剑指offer-day5
二维数组中的查找
一开始就想到了线性查找,但是是从左上方开始的,发现判定条件不好写后看了看答案,才知道从右上方开始会比较方便(即大于查找值向左移,小于查找值向下移)
提交几次都发现会有边界溢出的情况,无奈只能跟答案一一对照,发现答案事先用了一个int值接住了要判断的值,这样就不会发生边界溢出了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Solution { public boolean findNumberIn2DArray(int[][] matrix, int target) { if(matrix.length == 0){ return false; } int m = 0; int n = matrix[0].length - 1; while(n >=0 && m < matrix.length){ int num = matrix[m][n]; if(num == target){ return true; } if(num > target){ n--; } if(num < target){ m++; } } return false; } }
|
旋转数组的最小数字
不想多说了,就是二分法,重点是怎么设定跳出条件,不然就是寄(是的,我又没做出来)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
class Solution { public int minArray(int[] numbers) { int i = 0, j = numbers.length - 1; while (i < j) { int m = (i + j) / 2; if (numbers[m] > numbers[j]) i = m + 1; else if (numbers[m] < numbers[j]) j = m; else j--; } return numbers[i]; } }
|
第一个只出现一次的字符
一开始就把题目想错了,以为类似为**"aadadaad"**的字符应该返回为空,但是实际上是返回a(a、d两两配对,第一个只剩一个的字母是a)
这道题应该是用哈希表解决的,放出代码。
1 2 3 4 5 6 7 8 9 10 11
| class Solution { public char firstUniqChar(String s) { HashMap<Character, Boolean> dic = new HashMap<>(); char[] sc = s.toCharArray(); for(char c : sc) dic.put(c, !dic.containsKey(c)); for(char c : sc) if(dic.get(c)) return c; return ' '; } }
|