一.48.?旋轉圖像
題目要求:就是一個順時針的旋轉過程。
?思路:觀察矩陣,得出翻轉前第i行的第J個元素? 等于? 翻轉后倒數第i列的第J個元素,舉例說明,第1行第2個元素為“2”,翻轉后到了 倒數第1列的第2個元素。說白了只需要針對翻轉前的第i行和翻轉后的倒數第i列
代碼:
class Solution {public void rotate(int[][] matrix) {int n = matrix.length;int[][] matrix_new = new int[n][n];// 按照思路對新矩陣存值for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {matrix_new[j][n - i - 1] = matrix[i][j];}}for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {matrix[i][j] = matrix_new[i][j];}}}
}
二.240.?搜索二維矩陣 II
題目要求:編寫一個高效的算法來搜索?m?x?n
?矩陣?matrix
?中的一個目標值?target
?。該矩陣具有以下特性:
- 每行的元素從左到右升序排列。
- 每列的元素從上到下升序排列
思路:這個題可以直接使用雙層for循環暴力破解; 也可以使用二分查找
代碼:
class Solution {public boolean searchMatrix(int[][] matrix, int target) {for (int[] row : matrix) {int a = search(row, target);// 務必注意這里只要找到了就直接return true 而不是找不到return falseif (a >= 0)return true;}return false;}// 二分查找即可public int search(int[] nums, int target){int l = 0;int r = nums.length - 1;while (l <= r){int mid = l +((r - l) >> 1);if (nums[mid] > target)r = mid - 1;else if (nums[mid] < target)l = mid + 1;elsereturn mid;}return -1;}
}
三、234.?回文鏈表
題目要求:
?思路:因為鏈表無法使用雙指針做,所以先將鏈表的值復制到數組中,然后使用雙指針進行判斷。
代碼:
class Solution {public boolean isPalindrome(ListNode head) {// 將鏈表的值復制到數組中List<Integer> vals = new ArrayList<Integer>();ListNode cur = head;while (cur != null){vals.add(cur.val);cur = cur.next;}// 雙指針判斷是否回文int l = 0;int r = vals.size() - 1;while (l < r){if (vals.get(l) != vals.get(r))return false;l++;r--;}return true;}
}