1.  
  1. // 小白一名,0算法基础,艰难尝试算法题中,若您发现本文中错误,
      或有其他见解,往不吝赐教,感激不尽,拜谢。
  1. 领扣 915 今日算法
    题干
    //给定一个数组 A,将其划分为两个不相交(没有公共元素)的连续子数组 left 和 right, 使得:
    //
    // left 中的每个元素都小于或等于 right 中的每个元素。
    // left 和 right 都是非空的。
    // left 要尽可能小。
    // 在完成这样的分组后返回 left 的长度。可以保证存在这样的划分方法。
    // 示例 1:
    //
    // 输入:[5,0,3,8,6]
    // 输出:3
    // 解释:left = [5,0,3],right = [8,6]
    // 示例 2:
    //
    // 输入:[1,1,1,0,6,12]
    // 输出:4
    // 解释:left = [1,1,1,0],right = [6,12]
    初次使用方法
  1. /*
    * 看到这道题的第一思路就是创建一个左数组,
    * 通过一层循环赋值并求出最大数,
    * 再进行一次循环来与右数组的元素依次进行比较
    * 完善并测试了下代码后提交发现超出时间限制
    * */
  1. public static int partitionDisjoint(int[] A) {
  2. //创建一个链式集合来充当左数组
  3. LinkedList<Integer> list = new LinkedList();
  4. //创建一个判断标记
  5. boolean flag = true;
  6. //外循环 循环向左数组进行添加元素
  7. for (int a = 0; a < A.length - 1; a++) {
  8. //向集合添加元素
  9. list.add(A[a]);
  10. //排序并获取最大值
  11. Collections.sort(list);
  12. int max = list.getLast();
  13. //重置标记的初值
  14. flag = true;
  15. //被循环 进行判断
  16. for (int b = a + 1; b < A.length; b++) {
  17. //当右数组存在小于max的值时,标记更改
  18. if (max > A[b]) {
  19. flag = false;
  20. }
  21. }
  22. //标记更改 继续循环 未更改 获得长度
  23. if (flag) {
  24. return (a + 1);
  25. }
  26. }
  27. return 0;
  28. }

第一次代码

  1. /*
    * 个人总经问题出现在了链式集合上,进行了许多没必要的操作
    * 例如 添加 排序 解题的思路除了问题
    * 这时感觉应该找寻一下规律
    * 发现获得最大值没必要全部左数组进行比较
    * 使用之前的最大值与新加入的值进行比较就可以了
    * 本着这种思路测试后 58组数据处理时间6ms左右
    * */
  1. public static int partitionDisjoint1(int[] A) {
  2. //左数组最大值
  3. int max = A[0];
  4. // 左数组长度
  5. int a;
  6. //创建标记
  7. boolean flag;
  8. //跳出标签
  9. out:
  10. //外循环为左数组长度
  11. for (a = 0; a < A.length - 1; a++) {
  12. //初始化标记
  13. flag = true;
  14. //内循环记性判断比较
  15. for (int b = a + 1; b < A.length; b++) {
  16. //存在小于max的元素时 更改标记 并打断本次循环
  17. if (max > A[b]) {
  18. flag = false;
  19. break;
  20. }
  21. }
  22. //如标记未发生更改,即左右数组已经符合条件 跳出所有循环
  23. if (flag) {
  24. break out;
  25. }
  26. /*
  27. * 未跳出循环 当前新填入的值与之前的最大值进行比较
  28. * 大于则互换,小于则不变
  29. * */
  30.  
  31. if (max < A[a + 1]) {
  32. max = A[a + 1];
  33. }
  34. }
  35. //返回长度
  36. return a + 1;
  37. }

第二次代码

  1. /*
    * 目前最优代码的思路很清晰,考虑的跟周全
    * 老实说 感觉他的代码更富有些 美感?
    * 不知道是不是 因为他是目前最优的原因
    * 虽然他的逻辑我能理解
    * 但是总感觉有更深的细节在其中
    * 作为一个刚刚踏入算法领域的小白
    * 我觉得未来还有很长的路要走
    * 还有很多的东西要学
    * */
  1. public static int bestMehtod(int[] A) {
  2. //最小长度左数组的最大值
  3. int max = A[0];
  4. //临时最大值
  5. int nowmax;
  6. //
  7. int j;
  8. //左数组长度
  9. int i;
  10. //确保左右各数组合都有元素
  11. if (A[0] == A[A.length - 1])
  12. return 1;
  13. //goto标签 跳出多重循环
  14. out:
  15. //外循环 首先判断当前的左数组的最大值和将要加入的元素大小关系
  16. for (i = 1; i < A.length; i++) {
  17. //判断下一个元素和之前左数组的最大值的关系
  18. if (max > A[i]) {
  19. //大于 直接跳过本次循环 长度增加
  20. continue;
  21. } else {
  22. //小于 将下一个元素赋值给临时最大值?(为啥设置了这个临时值,优化了这个代码?)
  23. nowmax = A[i];
  24. //内循环
  25. for (j = i; j < A.length; j++) {
  26. //依次判断每个元素是否大于最大值
  27. if (A[j] >= max) {
  28. //大于,再判断右数组长度是否最小了
  29. if (j == (A.length - 1))
  30. //是 因out标签位置跳出所有循环
  31. break out;
  32. //否 跳过本次循环
  33. continue;
  34. } else {
  35. //小于 将临时最大值赋值给max 并跳出此次循环
  36. max = nowmax;
  37. break;
  38. }
  39. }
  40.  
  41. }
  42.  
  43. }
  44. //返回长度
  45. return i;
  46. }

目前答案中最优代码

我们生活在泥沼之中,但是有人依然仰望星空。

We are all in the gutter, but some of us are looking at the stars.

                                                                写于2018.11.16

  1.  

day1——分割数组的更多相关文章

  1. lintcode 容易题:Partition Array by Odd and Even 奇偶分割数组

    题目: 奇偶分割数组 分割一个整数数组,使得奇数在前偶数在后. 样例 给定 [1, 2, 3, 4],返回 [1, 3, 2, 4]. 挑战 在原数组中完成,不使用额外空间. 解题: 一次快速排序就可 ...

  2. LeetCode 548. Split Array with Equal Sum (分割数组使得子数组的和都相同)$

    Given an array with n integers, you need to find if there are triplets (i, j, k) which satisfies fol ...

  3. LeetCode——数组篇:659. 分割数组为连续子序列

    659. 分割数组为连续子序列 输入一个按升序排序的整数数组(可能包含重复数字),你需要将它们分割成几个子序列,其中每个子序列至少包含三个连续整数.返回你是否能做出这样的分割? 示例 1: 输入: [ ...

  4. lintcode373 奇偶分割数组

    奇偶分割数组 分割一个整数数组,使得奇数在前偶数在后. 您在真实的面试中是否遇到过这个题? Yes 样例 给定 [1, 2, 3, 4],返回 [1, 3, 2, 4]. 我的方法:设定两个数组,分别 ...

  5. LintCode-373.奇偶分割数组

    奇偶分割数组 分割一个整数数组,使得奇数在前偶数在后. 样例 给定 [1, 2, 3, 4],返回 [1, 3, 2, 4]. 挑战 在原数组中完成,不使用额外空间. 标签 数组 两根指针 code ...

  6. php用explode,可以提供多个字符作为分割符来进行分割数组吗?

    explode — 使用一个字符串分割另一个字符串, 它的函数原型如下: array explode ( string $delimiter , string $string [, int $limi ...

  7. LeetCode 410——分割数组的最大值

    1. 题目 2. 解答 此题目为 今日头条 2018 AI Camp 5 月 26 日在线笔试编程题第二道--最小分割分数. class Solution { public: // 若分割数组的最大值 ...

  8. Leetcode 659.分割数组为连续子序列

    分割数组为连续子序列 输入一个按升序排序的整数数组(可能包含重复数字),你需要将它们分割成几个子序列,其中每个子序列至少包含三个连续整数.返回你是否能做出这样的分割? 示例 1: 输入: [1,2,3 ...

  9. Leetcode 410.分割数组的最大值

    分割数组的最大值 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组.设计一个算法使得这 m 个子数组各自和的最大值最小. 注意:数组长度 n 满足以下条件: 1 ≤ n ...

随机推荐

  1. webstorm 2018 Eslint修复 快捷键设置

    首先确保eslint插件已安装 已勾选

  2. 接口自动化框架(java)--2.接口用例POST请求,参数配置

    这套框架的报告是自己封装的 Post类型的接口通常有请求参数,请求参数也是json类型,所以需要写一个类将请求参数序列化成json对象 以常见的登录接口为例 新建一个package,和postPara ...

  3. virtual dom 简单了解

    管理应用程序状态和用户界面的同步一直是前端UI开发复杂性的主要来源.目前出现了不同的方式来处理这个问题.本文简单讨论其中一种方式virtual dom. 文章概要: virtual dom 基本概念, ...

  4. Nginx配置选项

    --prefix=path    定义一个目录,存放服务器上的文件 ,也就是nginx的安装目录.默认使用 /usr/local/nginx. --sbin-path=path 设置nginx的可执行 ...

  5. 目标检测方法——R-FCN

    R-FCN论文阅读(R-FCN: Object Detection via Region-based Fully Convolutional Networks ) 目录 作者及相关链接 方法概括 方法 ...

  6. android 开发设计模式---Strategy模式

    假设我们要出去旅游,而去旅游出行的方式有很多,有步行,有坐火车,有坐飞机等等.而如果不使用任何模式,我们的代码可能就是这样子的. 12345678910111213141516171819202122 ...

  7. JavaScript字符串字节长度

    var txt2="He中!!";var t = txt2.replace(/[^\u0000-\u00ff]/g,"aa").length;//值是7

  8. 信步漫谈之JDK—源码编译

    一.环境 Linux 系统:CentOS_6.5_x86_64 JDK 安装包:jdk-7u80-linux-x64.rpm OpenJDK 源码包:OpenJDK7 下载路径:http://down ...

  9. Tableau 学习资料

    官方文档: https://www.tableau.com/zh-cn/support/help 其他教程: tablaue破解版_tableau10 破解_tableau server 破解:htt ...

  10. vue 显示 webpack-dev-server不是内部命令的解决办法

    然后在cmd中cd到项目目录,依次运行命令: npm install 和 npm run build 最后运行 npm run dev 后项目成功运行.