数组
059
这个作者很懒,什么都没留下…
展开
-
行星碰撞( 暴力从左遍历 + 栈)
思路i >= 0这个条件,属于边界条件,不写会卡用例,1, -2, -2, -2。import java.util.Arrays;class Suit { public static int[] asteroidCollision(int[] asteroids) { int len = asteroids.length; int size = len; for (int i = 0; i < size - 1; i++) { .原创 2021-10-10 18:37:32 · 101 阅读 · 0 评论 -
三角形的最大周长
一、题目二、思路循环中的i–,有的时候总是考虑成i = i -2。class Solution { public int largestPerimeter(int[] nums) { Arrays.sort(nums); int len = nums.length; for (int i = len - 1; i >= 2; i --) { if (isTri(nums[i], nums[i - 1], nums原创 2021-09-25 18:55:52 · 103 阅读 · 0 评论 -
两数之和
暴力法class Solution { public int[] twoSum(int[] nums, int target) { int []numId = new int[2]; for(int i = 0; i < nums.length; i++ ){ for(int j = i + 1; j < nums.length; j++){ if(nums[i] + nums[j] ==...原创 2020-08-14 13:18:09 · 160 阅读 · 0 评论 -
快慢指针解决删除排序数组中的重复项 II
一、题目二、代码暴力解法class Solution { //暴力 public int removeDuplicates(int[] nums) { int count = 0; int len = nums.length; int i = 1; while(i < len){//注意len会变化 if(nums[i] == nums[i - 1] ){ ..原创 2020-07-23 14:05:59 · 140 阅读 · 0 评论 -
搜索二维矩阵(二分法)
一、题目二、代码由高效可知,用二分法,引入虚拟数组。class Solution { public boolean searchMatrix(int[][] matrix, int target) { //假定一个虚拟数组,但不定义 int left = 0;//虚拟数组的左位置 if(matrix.length == 0){ return false; } int right.原创 2020-07-22 11:53:33 · 107 阅读 · 0 评论 -
矩阵置零
一、题目二、代码使用Set分别对元素为0的行号和列号去重class Solution { public void setZeroes(int[][] matrix) { Set<Integer> rowSet = new HashSet<>(); Set<Integer> columnSet = new HashSet<>(); int m = matrix.length; ..原创 2020-07-22 11:14:43 · 121 阅读 · 0 评论 -
最小路径和
一、题目二、代码动态规划。状态转移方程:dp(i,j)=grid(i,j)+min(dp(i+1,j),dp(i,j+1))class Solution { public int minPathSum(int[][] grid) { int m = grid.length; int n = grid[0].length; //设dp[i][j]为从左上角到(i,j)的最小路径 int[][] dp = ne.原创 2020-07-21 11:40:11 · 85 阅读 · 0 评论 -
不同路径 II
一、题目二、代码和之前的不同路径不同,引入了障碍物的概念。状态定义:dp[i][j]表示走到格子(i, j)的路径数。状态转移方程:当(i,j)上无障碍物时,dp[i][j] = dp[i - 1][j] + dp[i][j -1];当(i,j)上有障碍物时,dp[i][j] = 0。class Solution { public int uniquePathsWithObstacles(int[][] obstacleGrid) { int m...原创 2020-07-21 11:00:11 · 93 阅读 · 0 评论 -
生成螺旋矩阵
一、题目二、代码class Solution { public int[][] generateMatrix(int n) { int[][] matrix = new int[n][n]; //初始化 int left = 0; int top = 0; int right = matrix[0].length - 1; int bottom = matrix.length - 1; .原创 2020-07-20 10:47:30 · 221 阅读 · 0 评论 -
合并区间(贪心)
一、题目二、代码贪心算法:先按照区间左端点的值升序排序 如果当前遍历到的区间的左端点大于结果集中最后一个区间的右端点,说明它们没有交集,此时把区间添加到结果集 如果当前遍历到的区间的左端点小于结果集中最后一个区间的右端点,说明它们有交集,合并 class Solution { public int[][] merge(int[][] intervals) { if(intervals.length < 2) return intervals;.原创 2020-07-19 12:04:02 · 136 阅读 · 0 评论 -
跳跃游戏
一、题目二、代码贪心算法。从数组中的下标0位置开始遍历,并维护最远可以到达的位置。在遍历的过程中,如果最远可以到达的位置大于等于数组中的最后一个位置,那就说明最后一个位置可达。class Solution { public boolean canJump(int[] nums) { int len = nums.length; int maxIndex = 0; for (int i = 0; i < n; ++i) { ..原创 2020-07-16 13:22:32 · 141 阅读 · 0 评论 -
螺旋矩阵
一、题目二、代码按上右下左的行添加到链表class Solution { public List<Integer> spiralOrder(int[][] matrix) { List<Integer> result = new LinkedList<>(); if(matrix.length == 0){ return result; } //初始化 ..原创 2020-07-14 12:12:41 · 147 阅读 · 0 评论 -
旋转图像
一、题目二、代码class Solution { public void rotate(int[][] matrix) { //转置 int n = matrix.length; for(int i = 0; i < n; i++){ for(int j = i + 1; j < n; j++){ int temp = 0; tem..原创 2020-07-12 11:48:33 · 150 阅读 · 0 评论 -
在排序数组中查找元素的第一个和最后一个位置(二分查找)
一、题目二、代码由时间复杂度可知应为二分查找的变种class Solution { public int[] searchRange(int[] nums, int target) { // int[] range = new int[2]; int first = find(true, nums, target); int last = find(false, nums, target); // range[0] .原创 2020-07-06 11:42:23 · 126 阅读 · 0 评论 -
搜索旋转排序数组
一、题目二、代码由时间复杂度可知要用二分查找的变种class Solution { public int search(int[] nums, int target) { int low = 0; int high = nums.length - 1; while(low <= high){ int mid = (low + high) / 2; if(nums[mid] ..原创 2020-07-05 12:02:56 · 77 阅读 · 0 评论 -
不同的二叉搜索树(动态规划)
一、题目二、代码动态规划设n个节点存在二叉排序树的个数是G(n),f(i)为以i为根的二叉搜索树的个数,则G(n) = f(1) + f(2) + f(3) + f(4) + ... + f(n)f(i) = G(i-1)*G(n-i)综合两个公式可以得到 卡特兰数 公式G(n) = G(0)*G(n-1)+G(1)*G(n-2)+...+G(n-1)*G(0)class Solution { public int numTrees(int n) { ..原创 2020-07-03 13:07:23 · 96 阅读 · 0 评论 -
下一个排列
一、题目二、代码思路:一种情况是,例如一个数为123654,从位数5开始,其右边没有比它大的数,与4交换只会使得排列更小,向前推一位,以此类推,到3时,3 < 6。于是3与此数的末位比较,若3 >= 此数末位,则向前推一位继续和3比较;如果3 < 此数末位,则交换,此处是4,因此交换。交换之后此数变为124653,将653逆序,则可得到正确答案即124356。另一种情况是,例如一个数为654321,则逆序class Solution { public ..原创 2020-07-02 15:49:15 · 85 阅读 · 0 评论 -
全排列(回溯、DFS)
一、题目二、代码回溯class Solution { public List<List<Integer>> result = new LinkedList<>(); public List<List<Integer>> permute(int[] nums) { List<Integer> visited = new LinkedList<>(); bac..原创 2020-06-24 17:54:02 · 132 阅读 · 0 评论 -
计算最大子序和(分治)
一、题目二、代码前面已经使用动态规划解决,现在使用分治算法。连续子序列的最大和主要由这三部分子区间里元素的最大和得到:第 1 部分:子区间 [left, mid]。第 2 部分:子区间 [mid + 1, right]。第 3 部分:包含子区间[mid , mid + 1]的子区间,即 nums[mid] 与nums[mid + 1]一定会被选取。public class Solution { public int maxSubArray(int[] nums) ..原创 2020-06-20 17:13:55 · 223 阅读 · 0 评论 -
贪心算法解决整数转罗马数字
一、题目二、代码贪心算法,其是一种在当前时间做出最佳可能决策的算法;在这种情况下,它会取出最大可能的符号。每次寻找适合它的最大符号。我们减去它,然后再寻找适合最大符号,依此类推,直到结果为0。最后取出的每个符号都附加到输出的罗马数字字符串上。class Solution { public String intToRoman(int num) { int[] nums = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9,.原创 2020-06-17 12:41:28 · 187 阅读 · 0 评论 -
合并两个有序数组
一、题目二、代码此题不需要像合并有序链表,太过麻烦。只需分成两步,合并和排序。class Solution { public void merge(int[] nums1, int m, int[] nums2, int n){ //合并 int j = 0; for(int i = m; i < m + n; i++){ nums1[i] = nums2[j]; j++;..原创 2020-06-14 14:15:31 · 95 阅读 · 0 评论 -
盛最多水的容器
一、题目二、代码暴力解法。根据木桶法则,找到最小的边,即该容器的高。class Solution { public int maxArea(int[] height) { int maxv = 0; for(int i = 0; i < height.length; i++){ for(int j = i+ 1; j < height.length; j++){ maxv = M..原创 2020-06-13 14:44:33 · 132 阅读 · 0 评论 -
非空数组表示整数 加一
一、题目二、代码引入进位标志class Solution { public int[] plusOne(int[] digits) { int len = digits.length; boolean carry = false; //引入进位标志 for(int i = len - 1; i >= 0; i--){ if(i == len - 1){ digits[i] .原创 2020-06-13 13:58:02 · 164 阅读 · 0 评论 -
使用动态规划解决不同路径
一、题目二、代码动态规划的三个步骤:建立状态转移方程 dp[i][j] = dp[i - 1][j] + dp[i][j - 1]缓存并复用以往结果 按顺序从小往大算class Solution { public int uniquePaths(int m, int n) { int[][] dp = new int[m][n]; for(int i = 0; i < m; i++){ ...原创 2020-06-11 18:54:30 · 175 阅读 · 0 评论 -
最长公共前缀
一、题目二、代码暴力解法class Solution { public String longestCommonPrefix(String[] strs){ if(strs.length == 0){ return ""; } int i = 0; String common = ""; int minlen = Integer.MAX_VALUE; for(..原创 2020-06-11 17:46:20 · 86 阅读 · 0 评论 -
移除数组中特定元素
一、题目二、代码暴力算法class Solution { public int removeElement(int[] nums, int val) { if(nums.length == 0){ return 0; } int len = nums.length; int i = 1; while(i < len){ if(nums[i - ...原创 2020-06-11 15:20:22 · 255 阅读 · 0 评论 -
搜索插入位置
一、思路二、代码顺序搜索,注意i < nums.length 和nums[i] <= target的顺序。class Solution { public int searchInsert(int[] nums, int target) { int i = 0; for(i = 0; i < nums.length && nums[i] <= target; i++){ if(nums..原创 2020-06-08 10:51:21 · 88 阅读 · 0 评论 -
冒泡排序和双指针解决颜色分类
一、题目二、代码冒泡排序class Solution { public void sortColors(int[] nums) { // Arrays.sort(nums); for(int i = 0; i < nums.length - 1; i++){ for(int j = 0; j < nums.length - 1; j++){ if(nums[j] > nums[.原创 2020-06-04 14:02:49 · 214 阅读 · 0 评论