
数组和矩阵问题
dp小王子
讲真的,写博客好累。。。
展开
-
大楼轮廓
【题目】水平面上有 N 座大楼,每座大楼都是矩阵的形状,可以用一个三元组表示 (start, end, height),分别代表其在x轴上的起点,终点和高度。大楼之间从远处看可能会重叠,求出 N 座大楼的外轮廓线。外轮廓线的表示方法为若干三元组,每个三元组包含三个数字 (start, end, height),代表这段轮廓的起始位置,终止位置和高度。public class BuildingO...原创 2019-01-18 17:37:01 · 359 阅读 · 0 评论 -
数组中子数组的最大累乘积
【题目】给定一个double类型的数组arr,其中的元素可正、可负、可0,返回子数组累乘的最大乘积。例如,arr=[-2.5,4,0,3,0.5,8,-1],子数组[3,0.5,8]累乘可以获得最大的乘积12,所以返回12.public class MaxProduct { public static double maxProduct(double[] arr) { if (arr ==...原创 2019-02-28 17:02:00 · 232 阅读 · 0 评论 -
打印N个数组整体最大的TopK
【题目】有N个长度不一的数组,所有的数组都是有序的,请从大到小打印这N个数组整体最大的前K个数。【要求】1.如果所有数组的元素个数小于K,则从大到小打印所有的数。要求时间复杂度为O(KlogN).public class NTopK { public static class HeapNode { public int value; public int arrNum; pub...原创 2019-02-28 17:35:07 · 762 阅读 · 0 评论 -
子数组的最大累加和问题
【题目】给定一个数组arr,返回子数组的最大累加和。例如,arr=[1,-2,3,5,-2,6,-1],所有的子数组中,[3,5,-2,6]可以累加出最大的和12,所以返回12.【要求】如果arr长度为N,要求时间复杂度为O(N),额外空间复杂度为O(1)public class MaxSum { public static int maxSum(int[] arr) { if (ar...原创 2019-02-25 16:37:24 · 211 阅读 · 0 评论 -
子矩阵的最大累加和问题
【题目】给定一个矩阵matrix,其中的值有正、有负,有0,返回子矩阵的最大累加和。例如,矩阵matrix为:-90 48 7864 -40 64-81 -7 66其中,最大累加和的子矩阵为:48 78-40 64-7 66所以返回累加和为209。public class MaxMatrixSum { public static int maxSum(int[][] m) {...原创 2019-02-25 16:37:35 · 296 阅读 · 0 评论 -
在数组中找到一个局部最小的位置
【题目】定义局部最小的概念。arr长度为1时,arr[0]是局部最小。arr的长度为N(N>1)时,如果arr[0] < arr[1],arr[0]是局部最小;如果arr[N-1] < arr[N-2],那么arr[N-1]是局部最小;如果0<i<N-1,既有arr[i]<arr[i-1],又有arr[i]<arr[i+1],那么arr[i]是局部最小。...原创 2019-02-25 17:22:45 · 166 阅读 · 0 评论 -
需要排序的最短子数组长度
【题目】给定一个无序数组arr,求出需要排序的最短子数组长度。例如:arr=[1,5,3,4,2,6,7]返回4,因为只有[5,3,4,2]需要排序public class GetMinLength { /* * 给定一个无序数组arr,求出需要排序的最短子数组长度 */ public static int getMinLength(int[] arr) { if (arr =...原创 2019-03-01 16:33:24 · 252 阅读 · 0 评论 -
在行列都排好序的矩阵中找数
【题目】给定一个有N*M的整型矩阵matrix和一个整数K,matrix的每一行和每一列都是排好序的。实现一个函数,判断K是否在matrix中。public class Iscontains { public static boolean isContains(int[][] matrix, int k) { int row = 0; int col = matrix[0].lengt...原创 2019-03-01 16:33:41 · 317 阅读 · 0 评论 -
最长的可整合子数组的长度
【题目】先给出可整合数组的定义:如果一个数组在排好序之后,每相邻两个数差的绝对值都为1,则该数组为可整合数组。给定一个整型数组arr,请返回其中最大可整合 子数组的长度。例如,[5,5,3,2,6,4,3]的最大可整合子数组为[5,3,2,6,4],所以返回5。public class GetLIL { // 暴力解法 public static int getLIL1(int[] arr)...原创 2019-03-01 16:33:58 · 273 阅读 · 0 评论 -
不重复打印排序数组中相加和为给定值的所有二元组和三元组
【题目】给定排序数组arr和整数k,不重复打印arr中所有相加和为k的不降序二元组。例如,arr=[-8,-4,-3,0,1,2,4,5,8,9],k=10,打印结果为:1,92,8public class PrintUniquePair { /* * 定排序数组arr和整数k,不重复打印arr中所有相加和为k的不降序二元组 */ public static void print...原创 2019-03-01 16:34:22 · 486 阅读 · 0 评论 -
不包含本位置的累乘数组
【题目】给定一个整型数组arr,返回不包含本位置值的累乘数组。例如,arr=[2,3,1,4],返回[12,8,24,6],即除自己外,其他位置上的累乘。【要求】时间复杂度为O(N)除需要返回的结果数组外,额外空间复杂度为O(1) public static int[] product1(int[] arr) { if (arr == null || arr.length == 0) ...原创 2019-02-28 17:01:21 · 187 阅读 · 0 评论 -
边界都是1的最大正方形大小
【题目】给定一个N*N的矩阵matrix,在这个矩阵中,只有0和1两种值,返回边框全是1的最大正方形的边长长度。public class MatrixBorder1 { public void setBorderMap(int[][] m, int[][] right, int[][] down) { int r = m.length; int c = m[0].length; i...原创 2019-02-28 17:01:05 · 273 阅读 · 0 评论 -
数组的异或和
定义数组的异或和的概念:数组中所有的数异或起来,得到的结果叫做数组的异或和,比如数组{3,2,1}的异或和是,321 = 0【题目】给定一个数组arr,你可以任意把arr分成很多不相容的子数组,你的目的是:分出来的子数组中,异或和为0的子数组最多。请返回:分出来的子数组中,异或和为0的子数组最多是多少?public class MostXOR { public static int mo...原创 2019-01-18 17:37:47 · 4069 阅读 · 0 评论 -
未排序数组中累加和为给定值的最长子数组系列问题
【题目】给定一个数组arr,和一个整数num,求在arr中,累加和等于num的最长子数组的长度例子:arr = {7,3,2,1,1,7,7,7} num = 7 其中有很多的子数组累加和等于7,但是最长的子数组是{3,2,1,1},所以返回其长度4思路: 1.设置变量sum = 0,表示从0位置开始一直加到i位置所有元素的和。设置变量len = 0,表示累加和为k的最长子数组长度。设置哈...原创 2019-01-18 17:38:10 · 588 阅读 · 2 评论 -
未排序数组中累加和小于或等于给定值的最长子数组长度
【题目】未排序数组中累加和小于或等于给定值的最长子数组长度思路:依次求以数组的每个位置结尾的、累加和小于或等于K的最长子数组长度,其中最长的那个子数组长度就是我们要的结果。public class MaxLongsLengthSE { public static int maxLength(int[] arr, int k) { int[] helpArr = new int[arr.l...原创 2019-01-18 17:38:23 · 399 阅读 · 0 评论 -
未排序正数数组中累加和为给定值的最长子数组长度
【题目】给定一个数组arr,该数组无序,但每个值都是正数,再给定一个正数k, 求arr的所有子数组中所有元素相加和为K的最长子数组长度。思路:两个变量left和right标记子数组左右两头,开始left = 0,right = 01.开始时变量left = 0, right = 0,代表子数组arr[left…right].2.变量sum始终表示子数组arr[left…right]的和。开始...原创 2019-01-18 17:38:36 · 429 阅读 · 0 评论 -
转圈打印矩阵
【题目】给定一个整型矩阵matrix,请按照转圈的方式打印它。public class PrintMatrixSpiralOrder { public static void spiralOrderPrint(int[][] matrix) { int tR = 0; int tC = 0; int dR = matrix.length - 1; int dC = matrix...原创 2019-02-24 14:12:30 · 156 阅读 · 0 评论 -
将正方形矩阵顺时针转动90度
【题目】给定一个N*N的矩阵matrix,把这个矩阵调整成顺时针转动90度后的形式。要求:额外空间复杂度为O(1)public class Rotate90 { public static void rotate(int[][] matrix) { int tC = 0; int tR = 0; int dC = matrix.length; int dR = matrix[...原创 2019-02-24 17:56:44 · 503 阅读 · 0 评论 -
之字型打印矩阵
【题目】给定一个;矩阵matrix,按照“之”字形的方式打印这个矩阵。public class PrintMatrixZigZag { public static void printMatrixZigZag(int[][] matrix) { int tC = 0; int tR = 0; int dC = 0; int dR = 0; int endR = matrix...原创 2019-02-24 17:56:58 · 287 阅读 · 0 评论 -
从N个数中等概率打印M个数
从N个数中等概率打印M个数【题目】给定一个长度为N且没有重复元素的重复数组arr和一个整数n,实现函数等概率的随机打印arr中的M个数。【要求】相同的数不重复打印时间复杂度为O(M),额外空间复杂度为O(1)可以改变arr数组public class PrintNM { public static void printNM(int[] arr, int m) { if (ar...原创 2019-02-28 17:00:06 · 289 阅读 · 0 评论 -
一行代码求两个数的最大公约数
【题目】给定两个不等于0的整数M和N,求M和N的最大公约数欧几里得算法:如果q和r分别是m除以n的商和余数,即m=nq+r,那么m和n的最大公约数等于等于q和r的最大公约数。public class GCD { public static int gcd(int m, int n) { return n == 0 ? m : gcd(n, m % n); }}...原创 2019-02-28 17:00:31 · 473 阅读 · 0 评论 -
计算数组的小和
【题目】数组小和的定义如下:例如,数组s=[1,3,5,2,4,6],在s[0]的左边小于或等于s[0]的数的和为0,在s[1]的左边小于或等于s[1]的数的和1,在s[2]左边小于等于s[2]的数的和为1+3=4,在s[3]的左边小于或等于s[3]的数的和为1,在s[4]的左边小于或等于s[4]的数的和为1+3+2=6,在s[5]的左边小于或等于s[5]的数的和1+3+5+2+4=15,所以s...原创 2019-03-01 16:34:37 · 462 阅读 · 0 评论