题目列表
- 56. 合并区间
- 169. 多数元素
- 470. 用 Rand7() 实现 Rand10()
- 31. 下一个排列
-
具体实现
56. 合并区间
输入:intervals = [[1,3],[2,6],[8,10],[15,18]] 输出:[[1,6],[8,10],[15,18]]
class Solution {public int[][] merge(int[][] a) {ArrayList<int[]> res = new ArrayList<>();//1. 按照左端点排序Arrays.sort(a,(o1,o2)->(o1[0]-o2[0]));//2. 看下一个区间的左端点在是否在本区间右端点的左侧int l = a[0][0], r = a[0][1];for(int i = 1; i < a.length; i++){//2.1 在则证明有交集,更新右端点if(a[i][0] <= r){r = Math.max(r, a[i][1]);}else{//2.2 不在证明没有交集,保留此区间即可int[] tmp = new int[2];tmp[0] = l;tmp[1] = r;res.add(tmp);l = a[i][0]; r = a[i][1];}}int[] tmp = new int[2];//最后一个区间!!!!!!!tmp[0] = l;tmp[1] = r;res.add(tmp);return res.toArray(new int[0][]);}}
169. 多数元素
r为当前数
c为当前数的库存
class Solution {public int majorityElement(int[] nums) {int r = nums[0], c = 1;for(int i = 1; i < nums.length; i++){if(nums[i] == r){c++;}else{c--;if(c == 0) {//一旦之前的数,消耗完了,就要更新新的候选数//r和c都要更新r = nums[i];c = 1;}}}return r;}}
470. 用 Rand7() 实现 Rand10()
class Solution extends SolBase {//1. 生成[1, 49]之间的随机数//调用一次rand7()生成1-7之间的随机数//rand7() - 1生成0-6之间的随机数//(rand7() - 1) * 7 ->[0, 42]//(rand7() - 1) * 7 + rand7() ->[1, 49]//2. 如果生成的数是41 - 49则舍弃掉,重新生成一个小于等于40的随机数//if (t > 40) return rand10();//3.//t - 1 ->[0, 39]//(t - 1) % 10 ->[0, 9]//(t - 1) % 10 + 1; ->[1, 10]public int rand10() {int t = (rand7() - 1) * 7 + rand7();if(t > 40) return rand10();return (t - 1) % 10 + 1;}}
31. 下一个排列
class Solution {public void reverse(int[] nums, int l, int r){while(l < r){int tmp = nums[l];nums[l] = nums[r];nums[r] = tmp;l++;r--;}}public void nextPermutation(int[] nums) {//2 3 5 4 1// ↑ ↑//2 4 5 3 1//2 4 1 3 5int k = nums.length - 1;//找到峰顶值while(k > 0 && nums[k - 1] >= nums[k]) k--;if(k == 0){reverse(nums, 0, nums.length - 1);}else{//交换 k - 1和k后面大于k - 1的最小的数int t = k;while(t < nums.length && nums[t] > nums[k - 1]) t++;int tmp = nums[k - 1];nums[k - 1] = nums[t - 1];nums[t - 1] = tmp;reverse(nums, k, nums.length - 1);}}}
上一个排列
把上面的两个>改成<即可
class Solution {public void reverse(int[] nums, int l, int r){while(l < r){int tmp = nums[l];nums[l] = nums[r];nums[r] = tmp;l++;r--;}}public void nextPermutation(int[] nums) {//2 4 1 3 5// ↑ k ↑//2 3 1 4 5//2 3 5 4 1int k = nums.length - 1;//找到低点值while(k > 0 && nums[k - 1] <= nums[k]) k--;if(k == 0){reverse(nums, 0, nums.length - 1);}else{//交换 k - 1和k后面小于k - 1的最小的数int t = k;while(t < nums.length && nums[t] < nums[k - 1]) t++;int tmp = nums[k - 1];nums[k - 1] = nums[t - 1];nums[t - 1] = tmp;reverse(nums, k, nums.length - 1);}}}
48. 旋转图像
左斜对角线交换
- 沿中轴交换
class Solution {public void rotate(int[][] matrix) {int m = matrix.length, n = matrix[0].length;for(int i = 0; i < m; i++){for(int j = 0; j < i; j++){int tmp = matrix[i][j];matrix[i][j] = matrix[j][i];matrix[j][i] = tmp;}}for(int i = 0; i < m; i++){for(int j = 0, k = n - 1; j < k; j++, k--){int tmp = matrix[i][j];matrix[i][j] = matrix[i][k];matrix[i][k] = tmp;}}}}
