题目一

给定一个正整数组成的无序数组arr,给定一个正整数值K

找到arr的所有子数组里,哪个子数组的累加和等于K,并且是长度最大的

返回其长度

//滑动窗口
public static int getMaxLength(int[] arr, int K) {if (arr == null || arr.length == 0 || K <= 0) {return 0;}int left = 0;int right = 0;int sum = arr[0];int len = 0;while (right < arr.length) {if (sum == K) {len = Math.max(len, right - left + 1);sum -= arr[left++];} else if (sum < K) {right++;if (right == arr.length) {break;}sum += arr[right];} else {sum -= arr[left++];}}return len;}

题目二

给定一个整数组成的无序数组arr,值可能正、可能负、可能0

给定一个整数值K

找到arr的所有子数组里,哪个子数组的累加和等于K,并且是长度最大的

返回其长度

//使用前缀和预处理数据
public static int maxLength(int[] arr, int k) {if (arr == null || arr.length == 0) {return 0;}// key:前缀和// value : 0~value这个前缀和是最早出现key这个值的HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();map.put(0, -1); // importantint len = 0;int sum = 0;for (int i = 0; i < arr.length; i++) {sum += arr[i];if (map.containsKey(sum - k)) {len = Math.max(i - map.get(sum - k), len);}if (!map.containsKey(sum)) {map.put(sum, i);}}return len;}

题目三

给定一个整数组成的无序数组arr,值可能正、可能负、可能0

给定一个整数值K

找到arr的所有子数组里,哪个子数组的累加和<=K,并且是长度最大的

返回其长度

public static int maxLengthAwesome(int[] arr, int k) {if (arr == null || arr.length == 0) {return 0;}int[] minSums = new int[arr.length];int[] minSumEnds = new int[arr.length];minSums[arr.length - 1] = arr[arr.length - 1];minSumEnds[arr.length - 1] = arr.length - 1;for (int i = arr.length - 2; i >= 0; i--) {if (minSums[i + 1] < 0) {minSums[i] = arr[i] + minSums[i + 1];minSumEnds[i] = minSumEnds[i + 1];} else {minSums[i] = arr[i];minSumEnds[i] = i;}}// 迟迟扩不进来那一块儿的开头位置int end = 0;int sum = 0;int ans = 0;for (int i = 0; i < arr.length; i++) {// while循环结束之后:// 1) 如果以i开头的情况下,累加和<=k的最长子数组是arr[i..end-1],看看这个子数组长度能不能更新res;// 2) 如果以i开头的情况下,累加和<=k的最长子数组比arr[i..end-1]短,更新还是不更新res都不会影响最终结果;while (end < arr.length && sum + minSums[end] <= k) {sum += minSums[end];end = minSumEnds[end] + 1;}ans = Math.max(ans, end - i);if (end > i) { // 还有窗口,哪怕窗口没有数字 [i~end) [4,4)sum -= arr[i];} else { // i == end,  即将 i++, i > end, 此时窗口概念维持不住了,所以end跟着i一起走end = i + 1;}}return ans;}

题目四

给定一个数组arr,给定一个值v

求子数组平均值小于等于v的最长子数组长度

// 暴力解,时间复杂度O(N^3),用于做对数器public static int ways1(int[] arr, int v) {int ans = 0;for (int L = 0; L < arr.length; L++) {for (int R = L; R < arr.length; R++) {int sum = 0;int k = R - L + 1;for (int i = L; i <= R; i++) {sum += arr[i];}double avg = (double) sum / (double) k;if (avg <= v) {ans = Math.max(ans, k);}}}return ans;}
// 想实现的解法2,时间复杂度O(N*logN)public static int ways2(int[] arr, int v) {if (arr == null || arr.length == 0) {return 0;}TreeMap<Integer, Integer> origins = new TreeMap<>();int ans = 0;int modify = 0;for (int i = 0; i < arr.length; i++) {int p1 = arr[i] <= v ? 1 : 0;int p2 = 0;int querry = -arr[i] - modify;if (origins.floorKey(querry) != null) {p2 = i - origins.get(origins.floorKey(querry)) + 1;}ans = Math.max(ans, Math.max(p1, p2));int curOrigin = -modify - v;if (origins.floorKey(curOrigin) == null) {origins.put(curOrigin, i);}modify += arr[i] - v;}return ans;}

解法三:每个数字都减V,然后算这个数组中累加和小于等于0的子数组哪个最长

// 想实现的解法3,时间复杂度O(N)public static int ways3(int[] arr, int v) {if (arr == null || arr.length == 0) {return 0;}for (int i = 0; i < arr.length; i++) {arr[i] -= v;}return maxLengthAwesome(arr, 0);}// 找到数组中累加和<=k的最长子数组public static int maxLengthAwesome(int[] arr, int k) {int N = arr.length;int[] sums = new int[N];int[] ends = new int[N];sums[N - 1] = arr[N - 1];ends[N - 1] = N - 1;for (int i = N - 2; i >= 0; i--) {if (sums[i + 1] < 0) {sums[i] = arr[i] + sums[i + 1];ends[i] = ends[i + 1];} else {sums[i] = arr[i];ends[i] = i;}}int end = 0;int sum = 0;int res = 0;for (int i = 0; i < N; i++) {while (end < N && sum + sums[end] <= k) {sum += sums[end];end = ends[end] + 1;}res = Math.max(res, end - i);if (end > i) {sum -= arr[i];} else {end = i + 1;}}return res;}

总结

题目一主要技巧:利用单调性优化

题目二主要技巧:利用预处理结构优化 + 讨论开头结尾

题目三主要技巧:假设答案法+淘汰可能性(很难,以后还会见到)


题目五

给定一个正方形矩阵matrix,原地调整成顺时针90度转动的样子

a  b  c          g  d  a

d  e  f           h  e   b

g  h  i            i    f   c

public static void spiralOrderPrint(int[][] matrix) {int tR = 0;int tC = 0;int dR = matrix.length - 1;int dC = matrix[0].length - 1;while (tR <= dR && tC <= dC) {printEdge(matrix, tR++, tC++, dR--, dC--);}}public static void printEdge(int[][] m, int tR, int tC, int dR, int dC) {if (tR == dR) {for (int i = tC; i <= dC; i++) {System.out.print(m[tR][i] + " ");}} else if (tC == dC) {for (int i = tR; i <= dR; i++) {System.out.print(m[i][tC] + " ");}} else {int curC = tC;int curR = tR;while (curC != dC) {System.out.print(m[tR][curC] + " ");curC++;}while (curR != dR) {System.out.print(m[curR][dC] + " ");curR++;}while (curC != tC) {System.out.print(m[dR][curC] + " ");curC--;}while (curR != tR) {System.out.print(m[curR][tC] + " ");curR--;}}}

题目六

给定一个长方形矩阵matrix,实现转圈打印

a  b  c  d

e  f   g  h

i   j   k   L

打印顺序:a b c d h L k j I e f g

public static void rotate(int[][] matrix) {int a = 0;int b = 0;int c = matrix.length - 1;int d = matrix[0].length - 1;while (a < c) {rotateEdge(matrix, a++, b++, c--, d--);}}public static void rotateEdge(int[][] m, int a, int b, int c, int d) {int tmp = 0;for (int i = 0; i < d - b; i++) {tmp = m[a][b + i];m[a][b + i] = m[c - i][b];m[c - i][b] = m[c][d - i];m[c][d - i] = m[a + i][d];m[a + i][d] = tmp;}}

题目七

给定一个正方形或者长方形矩阵matrix,实现zigzag打印

0 1 2

3 4 5

6 7 8

打印: 0 1 3 6 4 2 5 7 8

public static void printMatrixZigZag(int[][] matrix) {int tR = 0;int tC = 0;int dR = 0;int dC = 0;int endR = matrix.length - 1;int endC = matrix[0].length - 1;boolean fromUp = false;while (tR != endR + 1) {printLevel(matrix, tR, tC, dR, dC, fromUp);tR = tC == endC ? tR + 1 : tR;tC = tC == endC ? tC : tC + 1;dC = dR == endR ? dC + 1 : dC;dR = dR == endR ? dR : dR + 1;fromUp = !fromUp;}System.out.println();}public static void printLevel(int[][] m, int tR, int tC, int dR, int dC, boolean f) {if (f) {while (tR != dR + 1) {System.out.print(m[tR++][tC--] + " ");}} else {while (dR != tR - 1) {System.out.print(m[dR--][dC++] + " ");}}}

算法数据结构(三十五)----子数组达到累加和的最大长度系列相关推荐

  1. 代码随想录算法训练营三十五天|860,406,452

    860. 柠檬水找零 贪心,20-10+5,10-5 class Solution { public:bool lemonadeChange(vector<int>& bills) ...

  2. PhotoShop算法实现高级篇--色彩特效(三十五)

    PhotoShop算法实现高级篇--色彩特效(三十五) kezunhai@gmail.com http://blog.csdn.net/kezunhai Photoshop中有很多色彩特效,本文介绍几 ...

  3. 程序员编程艺术第三十四~三十五章:格子取数问题,完美洗牌算法

    第三十四~三十五章:格子取数,完美洗牌算法 作者:July.caopengcs.绿色夹克衫.致谢:西芹_new,陈利人, Peiyush Jain,白石,zinking. 时间:二零一三年八月二十三日 ...

  4. 程序员编程艺术第三十四 三十五章 格子取数问题,完美洗牌算法

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 第三十四 ...

  5. 盘点:三十五个非主流开源数据库

    盘点:三十五个非主流开源数据库 几乎每个Web开发人员都有自己喜欢的数据库,或自己最熟悉的数据库,但最常见的无外乎以下几种: MySQL PostgreSQL MSSQL Server SQLite ...

  6. [Python从零到壹] 三十五.图像处理基础篇之OpenCV绘制各类几何图形

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  7. JAVA之旅(三十五)——完结篇,终于把JAVA写完了,真感概呐!

    JAVA之旅(三十五)--完结篇,终于把JAVA写完了,真感概呐! 这篇博文只是用来水经验的,写这个系列是因为我自己的java本身也不是特别好,所以重温了一下,但是手比较痒于是就写出了这三十多篇博客了 ...

  8. stm32 读取sd卡图片显示_「正点原子STM32Mini板资料连载」第三十五章 汉字显示实验...

    1)实验平台:正点原子STM32mini开发板 2)摘自<正点原子STM32 不完全手册(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第三十五章 汉字显示实验 汉字显示在 ...

  9. 计算机学院运动会海报,运动会海报评比 | 第三十五届田径运动会,咱们燥起来...

    原标题:运动会海报评比 | 第三十五届田径运动会,咱们燥起来 第三十五届田径运动会 已经开始了!! 咱们燥起来!! 这几天的操场可真的是非常非常的热闹啊! 每个人都在为了运动会努力 有的方阵.有的团体 ...

最新文章

  1. Label 的作用是什么,是怎么用的?
  2. 英文书也没有那么难,跟着例子做,挺有意思的
  3. burpsuite collaborato模块简介 dns log、http_https log、smtp_smtps log
  4. debian下为python2.7 安装MySQLdb扩展(mariadb)
  5. 环境变量空格符号带来的坑
  6. VTK:网格之QuadricClustering
  7. linux安装RabbitMQ和amqp扩展(这个安装rabbitmq通过了但是代码测试没有通过)
  8. Vlc支持IE 360 低版本的Google浏览器
  9. CorePress-v4.5网站主题 WordPress主题
  10. 怎样三天训练出AI围棋大师?教你AlphaGo Zero的3个trick
  11. Gstreamer衬垫(pad)支持的媒体类型(三)
  12. 【NLPCC 2021】 First Call For Papers
  13. switch怎么用字符c语言,switch怎么用c语言-switch用c语言讲解
  14. 链表:递归中删除结点不发生断链
  15. 用浏览器访问防火墙提示建立连接失败的有点总结
  16. mysql是什么?mysql的特点
  17. 读书有益——》民间治咳偏方
  18. muduo学习笔记:net部分之Http--HttpServer
  19. 显卡驱动无法更新代码19注册列表位置
  20. win10硬盘锁怎么解除_大师教你解决win10系统取消移动硬盘写保护的图文办法

热门文章

  1. websphere负载均衡_使用WebSphere DataPower Appliances保护JSON有效负载
  2. 【形式化学习笔记】1:Event-B相继式(Sequent)和推理规则(Inference Rule)
  3. 非线性规划与KTT(一)
  4. 【技巧分享】股票代码规则
  5. 记录有关移动短信知识
  6. Linux 搭建NodeBB社区,搭建CAS登录认证平台,实现Nodebb接入企业CAS认证(二)
  7. c语言 按键切换显示屏,51单片机lcd1602按键切屏
  8. C语言基础之5:运算符、表达式和语句
  9. C语言之对 0, ‘0‘ , \0 以及 “0“ 的理解
  10. lightdm开机无法自启问题