![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数组
傅里叶不想变换_
这个作者很懒,什么都没留下…
展开
-
202. 快乐数
class Solution {// 用set判断该数是否出现过 public boolean isHappy1(int n) { Set<Integer> set = new HashSet<>(); while(n != 1 && !set.contains(n)){ set.add(n); n = getNext(n); } return .原创 2021-08-10 11:19:26 · 69 阅读 · 0 评论 -
287. 寻找重复数
class Solution { public int findDuplicate(int[] nums) { int n = nums.length; int l = 1, r = n - 1; while(l < r){ int count = 0; int mid = (l + r) / 2; for(int i = 0; i < n; i++){ ..原创 2021-08-10 10:59:51 · 65 阅读 · 0 评论 -
279. 完全平方数
思路:BFS,每一次是原数字减去了一个平方数,直到出现第一个0,此时走过的层数就是最小数量。比如传入的数是7,那应该就是如果传入16,那应该就是16->15,12,7,0 答案就是层数,也就是1.class Solution { public int numSquares(int n) { Queue<Integer> queue=new LinkedList<>(); HashSet<Integer> visite.原创 2021-08-09 22:27:03 · 77 阅读 · 0 评论 -
560. 和为K的子数组
思路:暴力,三层循环,外层循环确定边界[i, j],内层循环累加求和。class Solution { public int subarraySum(int[] nums, int k) { int n = nums.length; int count = 0; for(int i = 0; i < n; i++){ for(int j = i; j < n; j++){ int .原创 2021-08-09 10:53:41 · 80 阅读 · 0 评论 -
88. 合并两个有序数组
思路: 1.暴力,直接把nums2放入nums1的尾部,然后排序。class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { for (int i = 0; i != n; ++i) { nums1[m + i] = nums2[i]; } Arrays.sort(nums1); }} 2.双指针 缺点是需要新.原创 2021-07-25 10:32:27 · 46 阅读 · 0 评论 -
628. 三个数的最大乘积
思路:1.排序后,如果数组中全是非负数,则排序后最大的三个数相乘即为最大乘积;如果全是非正数,则最大的三个数相乘同样也为最大乘积。如果数组中有正数有负数,则最大乘积既可能是三个最大正数的乘积,也可能是两个最小负数(即绝对值最大)与最大正数的乘积。 2. 在方法一中,我们实际上只要求出数组中最大的三个数以及最小的两个数,因此我们可以不用排序,用线性扫描直接得出这五个数。class Solution { public int maximumProduct(int[] nums) { .原创 2021-07-09 10:04:46 · 330 阅读 · 0 评论 -
88. 合并两个有序数组
class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { int[] ans = new int[m + n]; int p1 = 0, p2 = 0, index = 0; while(p1 < m && p2 < n){ if(nums1[p1] <= nums2[p2]){ .原创 2021-06-29 20:12:51 · 53 阅读 · 0 评论 -
旋转数组专题
旋转数组思路: 将数组一分为二,其中一定有一个是有序的,另一个可能是有序,也能是部分有序。此时有序部分用二分法查找。无序部分再一分为二,其中一个一定有序,另一个可能有序,可能无序。就这样循环。旋转排序数组153. 寻找旋转排序数组中的最小值(无重复值)154. 寻找旋转排序数组中的最小值 II(有重复值)33. 搜索旋转排序数组(无重复值)81. 搜索旋转排序数组(有重复值)153. 寻找旋转排序数组中的最小值(无重复值)思路:class Solution { public int原创 2021-04-09 10:23:01 · 61 阅读 · 0 评论 -
Leetcode 413. 等差数列划分
思路:等差数列的性质 A[i] - A[i - 1] == A[i - 1] - A[i - 2]方法1:暴力,一旦当前区间不满足等差数列了,那就不需要继续判断了。class Solution { public int numberOfArithmeticSlices(int[] A) { int n = A.length; if(n < 3) return 0; int count = 0; for(int i = .原创 2021-01-08 11:15:45 · 108 阅读 · 0 评论 -
剑指 Offer 03. 数组中重复的数字
哈希class Solution { public int findRepeatNumber(int[] nums) { Map<Integer, Integer> map = new HashMap<>(); for(int i = 0; i < nums.length; i++){ if(map.containsKey(nums[i])){ map.put(nums[i], .原创 2021-01-07 22:30:03 · 45 阅读 · 0 评论 -
Leetcode 1267. 统计参与通信的服务器
思路:遍历一次矩阵,使用两个数组分别记录每一行每一列有多少个服务器。class Solution { public int countServers(int[][] grid) { int m = grid.length; int n = grid[0].length; int[] row = new int[m]; int[] col = new int[n]; for (int i = 0; i < m; .原创 2021-01-04 17:45:17 · 136 阅读 · 0 评论 -
Leetcode 1535.找出数组游戏的赢家
思路: 首先考虑 k=1 的情况,当k=1 时,只有 arr[0] 和 arr[1] 之间有一回合游戏,由于一定能分出胜负,因此直接返回 arr[0] 和 arr[1] 中的最大值即可。 k > 1时,每回合游戏之后,较小的整数移至数组的末尾。**其实,并不需要对数组进行更新。在第一回合游戏之后,无论arr[0] 和arr[1] 当中谁取得胜利,第二回合游戏的另一个整数一定是 arr 中的下一个整数。**推广到一般的情况,当 2 ≤ i < arr.length 时,第 i 回合游戏一.原创 2021-01-04 17:25:28 · 176 阅读 · 0 评论 -
Leetcode 867. 转置矩阵
class Solution { public int[][] transpose(int[][] A) { int row = A.length; int col = A[0].length; int[][] f = new int[col][row]; for(int i = 0; i < col; i++){ for(int j = 0; j < row; j++){ .原创 2021-01-04 17:01:29 · 79 阅读 · 0 评论 -
Leetcode 73. 矩阵置零
思路1:开辟两个数组row_zero, col_zero 用来记录哪一行哪一列有0,然后遍历数组,如果该行或者该列有0,就把matrix[i][j]改为0class Solution { public void setZeroes(int[][] matrix) { if(matrix.length == 0 || matrix[0].length == 0) return; int[] row_zero = new int[matrix.length]; .原创 2020-12-27 14:40:02 · 96 阅读 · 0 评论 -
Leetcode 59. 螺旋矩阵 II
跟54题相似,四个方向。循环次数为n2n^2n2。class Solution { public int[][] generateMatrix(int n) { int start = 1, end = n * n; int[][] m = new int[n][n]; int l = 0, r = n - 1, u = 0, d = n - 1; while(start <= end){ for(in.原创 2021-01-04 09:42:11 · 59 阅读 · 0 评论 -
Leetcode 54.螺旋矩阵
思路:上下左右四个边界class Solution { public List<Integer> spiralOrder(int[][] matrix) { List<Integer> list = new ArrayList<>(); if (matrix.length == 0) return list; int l = 0, r = matrix[0].length - 1, u = 0, d = matr.原创 2021-01-03 20:57:05 · 85 阅读 · 0 评论 -
Leetcode 209. 长度最小的子数组
思路:1.暴力,对于 num[i],如果num[i]~num[j]的和 >= s,则返回其长度 j - i + 1 2.快慢指针,慢指针start,快指针end,变量sum记录 num[start]~num[end]的值,如果sum < s, end右移 如果sum >= s,更新其长度。然后将 nums[start] 从 sum 中减去并将 start 右移暴力法class Solution { public int minSubArrayLen(int s, in.原创 2021-01-03 20:28:47 · 54 阅读 · 0 评论 -
Leetcode 15. 三数之和
思路:这题跟15题,最接近的三数之和很像,但是难点在于去重。注意点: 当 nums[i]+nums[L]+nums[R]==0时,判断左界和右界是否和下一位置重复,去除重复解。并同时将 L,R 移到下一位置,寻找新的解优化:如果 nums[i]大于 0 则三数之和必然无法等于 0 ,结束循环class Solution { public List<List<Integer>> threeSum(int[] nums) { Arrays.sort(.原创 2021-01-01 22:58:17 · 48 阅读 · 0 评论 -
Leetcode 498. 对角线遍历
思路1:跟对角线遍历相似, i+j 为偶数时向上走,i+j 为奇数时向下走所以偶数对角线从头部加入元素LinkedList.addFirst,奇数对角线从尾部加入元素LinkedList.addLast,注意,只有LinkedList才有头插法和尾插法class Solution { public static int[] findDiagonalOrder(int[][] matrix) { Map<Integer, LinkedList<Integer>&.原创 2020-12-28 09:59:12 · 84 阅读 · 0 评论