leetocde.48:旋转图像-每日一题
给定一个 n × n 的二维矩阵表示一个图像。
将图像顺时针旋转 90 度。
说明:
你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像

class Solution {/*基本思路:先存储第i行第j个元素,然后将第j行n - i个元素赋值给它。然后将第n - i行n - j个元素赋值给第j行n - i个以此类推*/public void rotate(int[][] matrix) {int length = matrix.length;for(int i = 0; i < length / 2; i++) { //行for(int j = 0; j < (length + 1) / 2; j++) {//列int temp = matrix[i][j];matrix[i][j] = matrix[length - j - 1][i];matrix[length - 1 - j][i] = matrix[length - 1 - i][length - 1 - j];matrix[length - i - 1][length - j - 1] = matrix[j][length - i - 1];matrix[j][length - i - 1] = temp;}}}
}

leetocde.15:三数之和-hot100
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]

class Solution {public List<List<Integer>> threeSum(int[] nums) { /*基本思路:这种题很明显是首先要进行排序。原本的想法是用固定一个数,另外两个数去查哈希表,但是这样的话太复杂了于是使用双指针。当前数和后面两数加起来,如果大于0就移动右指针,小于0就移动左。等于0就加入结果集。此时,左右指针如果存在下一个数字相同,就需要继续移动左右指针直到不同*/Arrays.sort(nums);List<List<Integer>> result = new ArrayList<>();int length = nums.length;for(int i = 0; i < length - 2; i++) {//当数字大于0时,由于左右指针的数肯定大于它,于是三者肯定大于0,直接返回if(nums[i] > 0) return result;//当前数跟前一个一样,就可以直接跳过了if(i > 0 && nums[i] == nums[i - 1]) continue;//左:相对于当前数字的下一个数字    右:最末尾的数字int left = i + 1, right = length - 1;while(left < right) {//如果等于0if(nums[i] + nums[left] + nums[right] == 0) {//添加List<Integer> temp = new ArrayList<>(3);temp.add(nums[i]);temp.add(nums[left]);temp.add(nums[right]);result.add(temp);//存在左指针下一个数等于当前左指针所指的数,就移动左指针。右指针同理。//移动结束后左指针指的是最后一个相同的数while(left < right && nums[left + 1] == nums[left]) left++;while(left < right && nums[right - 1] == nums[right]) right--;//再次移动,此时左指针指的是与上一次所指不同的数了。比如左指针所指是 1 2 2 2 3//那么第一次是在第一个2,经过上面的while就指向第三个2//接下来就是在3left++;right--;}//如果大于0,移动右,下面同理else if(nums[i] + nums[left] + nums[right] > 0) {right--;}else {left++;}}}return result;}
}

leetocde.4:寻找两个正序数组的中位数
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。
进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?

//解法一:依次去两个数组中比较小的一个,取到第n/2个,但是需要判断奇偶int length_1 = nums1.length;int length_2 = nums2.length;int length = length_1 + length_2;int left = Integer.MIN_VALUE; int right = Integer.MIN_VALUE;int start_1 = 0, start_2 = 0;for(int i = 0; i <= length / 2; i++) {left = right;if(start_1 < length_1 && (start_2 >= length_2 || nums1[start_1] < nums2[start_2])) {right = nums1[start_1++];}  else {right = nums2[start_2++];}}if((length & 1) == 0) {return (left + right) / 2.0;}else {return right;}


第二种解法:二分(官方题解的视频,讲得很好)

class Solution {public double findMedianSortedArrays(int[] nums1, int[] nums2) {//思路:官方题解的视频,使用分割线来把两个数组分开,使得数组1和数组2的左边部分加起来等于n/2//把较短的数组赋给nums1,防止越界if(nums1.length > nums2.length) {int[] temp = nums1;nums1 = nums2;nums2 = temp;}int m = nums1.length;int n = nums2.length;//左边数组加起来的元素个数int totalLeft = (m + n + 1) / 2;int left = 0;int right = m;while(left < right) {//i为较短数组的下标 j为长数组的下标int i = left + (right - left + 1) / 2;int j = totalLeft - i;//当第一个数组分割线左边大于第二个数组分割线右边时,说明此时的划分不符合,缩小范围if(nums1[i - 1] > nums2[j]) {right = i - 1;} else {//同理 缩小范围left = i;}}int i = left;int j = totalLeft - i;int nums1LeftMax = i == 0 ? Integer.MIN_VALUE : nums1[i - 1];int nums1RightMin = i == m ? Integer.MAX_VALUE : nums1[i];int nums2LeftMax = j == 0 ? Integer.MIN_VALUE : nums2[j - 1];int nums2RightMin = j == n ? Integer.MAX_VALUE : nums2[j];if (((m + n) % 2) == 1) {return Math.max(nums1LeftMax, nums2LeftMax);} else {return (double) ((Math.max(nums1LeftMax, nums2LeftMax) + Math.min(nums1RightMin, nums2RightMin))) / 2;}  }
}


leetcode103:二叉树的锯齿形层序遍历
给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

class Solution {public List<List<Integer>> zigzagLevelOrder(TreeNode root) {/*基本思路:有点蠢的做法,就是根据左右依次交替,把节点添加到链表的最左或是最右进行遍历后面发现可以是跟普通层序遍历一样,只需要添加元素的时候添加到头或者尾就可以*/LinkedList<TreeNode> record = new LinkedList<TreeNode>();List<List<Integer>> result = new ArrayList<>();if(root == null) return result;record.offer(root);boolean left = true;while(!record.isEmpty()) {int length = record.size();List<Integer> tempList = new ArrayList<>();//如果是按从左往右就跟普通层序一样if(left) {for(int i = 0; i < length; i++) {TreeNode temp = record.poll();tempList.add(temp.val);if(temp.left != null) record.addLast(temp.left);if(temp.right != null) record.addLast(temp.right);}left = false;} else { //如果是右往左,就添加到第i个位置上for(int i = length - 1; i >= 0; i--) {TreeNode temp = record.remove(i);tempList.add(temp.val);if(temp.right != null) record.add(i, temp.right);if(temp.left != null) record.add(i, temp.left);}left = true;}result.add(tempList);  }return result;}
}

leetcode.55:跳跃游戏-hot100
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
示例 1:
输入: [2,3,1,1,4]
输出: true
解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。

class Solution {public boolean canJump(int[] nums) {//基本思路:从左往右遍历 如果找到第一个能到达终点的地方,就把这个点当作新的终点//接着往下找 直到退出循环 否则的话说明无法到达int length = nums.length;if(length == 0 || length == 1) return true;int now = length - 1;//now为当前的终点下标while(now > 0) {//临时记录终点下标int temp = now;for(int i = 0; i < now; i++) {if(nums[i] + i >= now) {now = i;}}//如果下标没有改变说明到不了这个终点直接退出if(now == temp) {return false;}}return true;}
}

leetcode.85:最大矩形-每日一题
给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。

输出:6

class Solution {public int maximalRectangle(char[][] matrix) {//基本思路:先创建一个矩阵 对应位置存放对应行的连续个数,如:0 1 1 0存放为 0 1 2 0//接着将其转换为一个求以i j为右下角坐标的最大矩阵问题int row = matrix.length;if(row == 0) return 0;int col = matrix[0].length;int[][] continuous = new int[row][col];//创建对应的行连续记录数组for(int i = 0; i < row; i++) {for(int j = 0; j < col; j++) {if(matrix[i][j] == '0') {continuous[i][j] = 0;} else {continuous[i][j] = j > 0 ? continuous[i][j - 1] + 1 : 1;}}}int result = 0;for(int i = 0; i < row; i++) {for(int j = 0; j < col; j++) {//如果当前点为0说明其不能构成一个矩形if(continuous[i][j] == 0) {continue;}//当前的最小长度int width = continuous[i][j];//当前的最大面积int area = width;for(int k = i - 1; k >= 0; k--) {//取较短者width = Math.min(width, continuous[k][j]);//取面积较大者area = Math.max(area, width * (i - k + 1));}result = Math.max(area, result);}}return result;}
}


leetcode.84:柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。

解法一:

class Solution {public int largestRectangleArea(int[] heights) {//基本思路:以当前柱子为右边界向左不断扩大取最大值int result = 0;for(int i = 0; i < heights.length; i++) {//当前柱子的面积int width = heights[i];int area = width;for(int j = i - 1; j >= 0; j--) {//往左进行扩大求面积width = Math.min(width, heights[j]);area = Math.max(area, (i - j + 1) * width);}//取最大值result = Math.max(result, area);}return result;}
}


解法二:

class Solution {public int largestRectangleArea(int[] heights) {// 这里为了代码简便,在柱体数组的头和尾加了两个高度为 0 的柱体。int[] tmp = new int[heights.length + 2];System.arraycopy(heights, 0, tmp, 1, heights.length); Deque<Integer> stack = new ArrayDeque<>();int area = 0;for (int i = 0; i < tmp.length; i++) {// 对栈中柱体来说,栈中的下一个柱体就是其「左边第一个小于自身的柱体」;// 若当前柱体 i 的高度小于栈顶柱体的高度,说明 i 是栈顶柱体的「右边第一个小于栈顶柱体的柱体」。// 因此以栈顶柱体为高的矩形的左右宽度边界就确定了,可以计算面积												

hazy的leetcode刷题笔记(五)相关推荐

  1. 卷进大厂系列之LeetCode刷题笔记:二分查找(简单)

    LeetCode刷题笔记:二分查找(简单) 学算法,刷力扣,加油卷,进大厂! 题目描述 涉及算法 题目解答 学算法,刷力扣,加油卷,进大厂! 题目描述 力扣题目链接 给定一个 n 个元素有序的(升序) ...

  2. LeetCode刷题笔记2——数组2

    LeetCode刷题笔记2--数组2 重塑数组 题目 在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原 ...

  3. 小何同学的leetcode刷题笔记 基础篇(01)整数反转

    小何同学的leetcode刷题笔记 基础篇(01)整数反转[07] *** [01]数学取余法*** 对数字进行数位操作时,常见的方法便是用取余的方法提取出各位数字,再进行操作 操作(1):对10取余 ...

  4. LeetCode刷题笔记汇总

    LeetCode刷题笔记汇总 第一次刷LeetCode写的一些笔记. 1.两数之和 3.无重复字符的最长子串 15.三数之和 18.四数之和 19.删除链表的倒数第 N 个结点 20.有效的括号 21 ...

  5. 【leetcode刷题笔记】动态规划

    #[leetcode刷题笔记]动态规划 石子游戏 public boolean stoneGame(int[] piles) {int N = piles.length;// dp[i][j] is ...

  6. LeetCode刷题笔记-动态规划-day4

    文章目录 LeetCode刷题笔记-动态规划-day4 55. 跳跃游戏 1.题目 2.解题思路 3.代码 45. 跳跃游戏 II 1.题目 2.解题思路 3.代码 LeetCode刷题笔记-动态规划 ...

  7. LeetCode刷题笔记- 15.三数之和

    LeetCode刷题笔记- 15.三数之和 C语言 题目 注意点 C语言 /*** Return an array of arrays of size *returnSize.* The sizes ...

  8. LeetCode刷题笔记第6题:Z字形变换

    LeetCode刷题笔记第6题:Z字形变换 想法: 要完成字符串根据给定的行数从上往下,从左到右完成Z字形排列.当只有一行时直接返回原字符串,当行数大于1时,先以行数构建一个行数数值个空字符串的列表, ...

  9. leetcode刷题笔记——二分查找

    leetcode刷题笔记--二分查找 目前完成的贪心相关的leetcode算法题序号: 中等:80,81 困难:4 来源:力扣(LeetCode) 链接:https://leetcode-cn.com ...

  10. LeetCode刷题笔记(算法思想 四)

    LeetCode刷题笔记(算法思想 四) 七.动态规划 斐波那契数列 70. 爬楼梯 198. 打家劫舍 213. 打家劫舍 II 信件错排 母牛生产 矩阵路径 64. 最小路径和 62. 不同路径 ...

最新文章

  1. 机器学习与统计学的争论,有意义吗?
  2. 【Mrak】C# 文本文件 ANSI编码格式 转 UTF8
  3. 柱状折线图2-双柱状重合堆积折线-重写图例点击事件
  4. 教育部拟规定:中小学不得公开学生个人的考试成绩名次
  5. tf.name_scope与tf.variable_scope
  6. HDU 3530Subsequence(单调队列)
  7. python做前端mongodb_Python爬虫之mongodb和python交互
  8. 总有几位老师让你一生感激不尽----我的大学老师
  9. 画吧为什么总是显示未连接服务器,画吧APP怎么用 使用方法汇总
  10. 高级系统架构师培训笔记
  11. kotlin类的成员变量 方法
  12. mysql假死_win7系统假死的5种情况和处理方法
  13. 算法总结——JS实现递归
  14. 我们都是代码接盘侠,请做一位好前任!
  15. 线性代数 --- 三种计算矩阵的行列式的方法之二 莱布尼兹展开法(个人笔记扫描版)
  16. 《潜规则》吴思-摘抄
  17. go build编译失败:imports xxx/xxx/xxx: build constraints exclude all Go files in xxx/xxx/xxx
  18. Android 地图导航调用百度地图、高德地图、腾讯地图,腾讯T3团队整理
  19. 解决flash播放器与您的地区不相容,中国特供版锁区+弹窗广告的流氓行为
  20. java中的类跟结构体_C#中的结构体与类的区别

热门文章

  1. 地球物理中的有限单元法-第二类边界条件-三角剖分-线性插值 matlab编程实现
  2. 原生JS实现addclass
  3. Android开发 更改返回按钮的图标
  4. c语言 实现markdown解析,marked
  5. 服务器网卡支持25G,25G服务器网卡光模块解决方案
  6. 用友vs金蝶产品分析(云星空与YonSuite)
  7. 实训第二天的代码优化
  8. 【学习日记】Dom基础
  9. 从host端对Windows虚机进行内存dump和分析
  10. Rabbitmq基于插件的延迟队列