【算法】【思想】做算法题中的一些思想总结
1 小技巧
// 数字 char 怎么得到它的 int char c = '5'; int num = c - '0' + 1;
2 思想
2.1 给定数的下一个接近的数
比如 241532 的下一个数 242135,主要是思想,从右往左找到第一个出现降序的,找到 15,然后从右边找到第一个比 1 大的,也就是 2,那么交换 1和2 现在变成 242531 ,然后把 2 后的 531 升序排列即可得到。
3 数组元素怎么找每个元素的左侧最大值或者右侧的最大值
比如左侧来说:第一个元素的左侧最大值就是它自己
那么第二个以上元素的左侧最大值就是当前元素跟上一个元素的最大值比较,哪一个比较大,哪个就是当前元素的最大值(因为上一个元素的最大值,也是一步步比较来的,是不是,只需要跟上一个元素的最大值比较即可)
class Solution { public int[] getFindMax(int[] arr) { int[] leftMax = new int[arr.length]; // 第一个元素的最大值就是自己 leftMax[0] = arr[0]; // 从一个元素开始遍历 for (int i = 1; i < arr.length; i++) { leftMax[i] = Math.max(leftMax[i - 1], arr[i]); } return leftMax; } }
4 n*n 2维矩阵翻转
4.1 上下翻转
// 上下翻转 n数组长度 i行取半 j列全取 for (int i = 0; i < n / 2; i++) { for (int j = 0; j < n; j++) { // i取对向 j不变 swap(matrix, i, j, n - i - 1, j); } }

4.2 左右翻转
// 左右翻转 n数组长度 i行全取 j列取半 for (int i = 0; i < n; i++) { for (int j = 0; j < n / 2; j++) { // i行不变 j取对向 swap(matrix, i, j, i, n - j - 1); } }

4.3 左上到右下对角线翻转
// 左上到右下对角线翻转 n数组长度 i行取n-1 j列取i // 从第二行开始 for (int i = 1; i < n; i++) { // 每行取 i 个 for (int j = 0; j < i; j++) { swap(matrix, i, j, j, i); } }

4.4 左下到右上对角线翻转
// 左下到右上对角线翻转 n数组长度 i行取n-1 j列取 n-i-1 // 从第一行开始 for (int i = 0; i < n - 1; i++) { // 每行取 n-i-1 个 for (int j = 0; j < n-i-1; j++) { swap(matrix, i, j, j, i); } }

给读者们抱歉,图我先欠着,没好好画哈。
5 位运算的知识
https://leetcode.cn/circle/discuss/CaOJ45/
6 链表删除倒数第n个
比如有10个节点,删除倒数第2个,双指针法
第一个指针先遍历 2个,然后第二个指针还是从头开始遍历,当第一个指针遍历到尾部时,第二个指针的下一个节点就是要被删除的节点,第二个指针跟第一个指针相差2个节点。
7 二维数组
int[][] intervals; // 对数组按左坐标进行升序排序 Arrays.sort(intervals, Comparator.comparingInt(o -> o[0])); // 定义返回结果 List<int[]> res = new ArrayList<>(); res.add(new int[]{left, right}); int[][] arr = res.toArray(new int[res.size()][]);

浙公网安备 33010602011771号