楼主: sickcat
跳转到指定楼层
上一主题 下一主题
收起左侧

[数组] 一道简单算法题求助

🔗
vegito2002 2018-5-22 05:08:18 | 只看该作者
全局:
729654213 发表于 2018-5-22 02:58
返回false的条件: array中有两个value满足a1 = a3,相当于找peak value,感觉可以用binary search的方法,O ...

应该不行吧, 1 2 3 4 5 6 7 0 8, 你第一个二分到了5之后,你怎么知道往左走还是往右走呢?
回复

使用道具 举报

🔗
randrand1 2018-5-22 05:10:18 | 只看该作者
全局:
这样应该没有问题了。
  1. /* package whatever; // don't place package name! */

  2. import java.util.*;
  3. import java.lang.*;
  4. import java.io.*;

  5. /* Name of the class has to be "Main" only if the class is public. */
  6. class Ideone {
  7. static boolean IgnoreIdxCheck(int[] sequence, int idx) {
  8.   for (int i = idx + 2; i < sequence.length; ++i) {
  9.    if (i == idx) continue;
  10.    if (sequence[i - 1] >= sequence[i]) return false;
  11.   }
  12.   if (idx != 0 && idx + 1 != sequence.length && sequence[idx - 1] >= sequence[idx + 1]) return false;
  13.   return true;
  14. }
  15. static boolean almostIncreasingSequence(int[] sequence) {
  16.   int idx = -1;
  17.   for (int i = 1; i < sequence.length; ++i) {
  18.    if (sequence[i-1] >= sequence[i]) {
  19.     idx = i;
  20.     break;
  21.    }
  22.   }
  23.   if (idx == -1) return true;
  24.   return IgnoreIdxCheck(sequence, idx - 1) || IgnoreIdxCheck(sequence, idx);
  25. }

  26. public static void main(String[] args) throws java.lang.Exception {
  27.   System.out.println(almostIncreasingSequence(new int[] {
  28.    1,
  29.    2,
  30.    2
  31.   }) == true);
  32.   System.out.println(almostIncreasingSequence(new int[] {
  33.    1,
  34.    3,
  35.    2,
  36.    1
  37.   }) == false);
  38. }
  39. }
复制代码
回复

使用道具 举报

🔗
729654213 2018-5-22 05:19:59 | 只看该作者
全局:
vegito2002 发表于 2018-5-22 05:08
应该不行吧, 1 2 3 4 5 6 7 0 8, 你第一个二分到了5之后,你怎么知道往左走还是往右走呢?

好问题啊 没考虑到。。。水平不佳。。。但又没法删评论了T.T
又想了想 只能扫一遍先把递减的(例子里面是0)找出来,然后考虑删7还是0,再往下面走,这样的话,应该还是O(N)
回复

使用道具 举报

🔗
lucifov 2018-5-22 06:29:19 | 只看该作者
全局:
有没有可能这样做:从0到n遍历,如果遇到不满足条件的的一对数字a_n+1<=a_n, 分之一:删掉a_n+1,从n开始,分之二:删掉a_n从a_n-1开始,然后对两个分支继续遍历,如果再遇到不符合条件的一堆数字,就直接return false
回复

使用道具 举报

🔗
阿钟 2018-5-22 06:34:28 | 只看该作者
全局:

  1. public class IncreasingSeq {
  2.         public static void main(String [] args) {
  3.                 System.out.println(aISeq(new int[] {1,2,3,4,5,6,3,4,9}) == false);
  4.                 System.out.println(aISeq(new int[] {1,2,3,4,5,6,4,9}) == true);
  5.                 System.out.println(aISeq(new int[] {1,2,7,3,4}) == true);
  6.                 System.out.println(aISeq(new int[] {1,2,7,3,4,3,4}) == false);
  7.                 System.out.println(aISeq(new int[] {1,2,7,6,3,4,}) == false);
  8.                 System.out.println(aISeq(new int[] {1,2,3}) == true);
  9.                 System.out.println(aISeq(new int[] {1,3,2}) == true);
  10.                 System.out.println(aISeq(new int[] {1,2,3,4,5,6,0,7}) == true);
  11.         }
  12.        
  13.         public static boolean aISeq(int[] A){
  14.                 boolean adj = false;
  15.                 int count = 0;
  16.                 for(int i = 1;i<A.length;i++) {
  17.                         int gap = A[i]-A[i-1];
  18.                         count+= gap;
  19.                         if(count < i-1 || gap<=0) {
  20.                                 if(adj) return false;
  21.                                 else {
  22.                                         adj = true;
  23.                                 }
  24.                         }       
  25.                 }
  26.                 return true;
  27.         }
  28. }
复制代码


也来说一下自己的思路?
首先这是一个int array,如果数列严格递增的话,A[i]-A[i-1] >=1, 那么考虑sum of A[i]-A[i-1], 在任何时候一定>=i
如果中间有最多一位非严格递增的话,那么设A’ 为删除A中某element之后A'严格递增,原数列sum of A[i]-A[i-1],  少算一个元素,在任何时候一定>=i-1
在某位非严格递增可以用A[i]-A[i-1] <=0 判定
然后如果两次违反上述规律return false就可以了,其它情况return true

回复

使用道具 举报

🔗
randrand1 2018-5-22 06:44:48 | 只看该作者
全局:
阿钟 发表于 2018-5-22 06:34
也来说一下自己的思路?
首先这是一个int array,如果数列严格递增的话,A-A >=1, 那么考虑sum of A-A ...

这个没完全理解,但是我找到了一个特列,
System.out.println(aISeq(new int[] {1,2,4,2}) == true);

补充内容 (2018-5-22 06:48):
。。。看错了
回复

使用道具 举报

🔗
randrand1 2018-5-22 06:52:55 | 只看该作者
全局:
randrand1 发表于 2018-5-22 06:44
这个没完全理解,但是我找到了一个特列,
System.out.println(aISeq(new int[] {1,2,4,2}) == true);

System.out.println(aISeq(new int[] {-2147483648,1, 2147483647}) == true); 这个算是特列
回复

使用道具 举报

🔗
阿钟 2018-5-22 07:35:40 | 只看该作者
全局:
randrand1 发表于 2018-5-22 06:52
System.out.println(aISeq(new int[] {-2147483648,1, 2147483647}) == true); 这个算是特列

overflow改用long 就行了 虽然思路应该没啥问题 写成这样就是有点懒得check前后哪个大……

补充内容 (2018-5-22 07:40):
哦,不过我觉得用long可能也有点问题,如果array太大那么还是会overflow……为了防止不overflow那么我们还是暴力考虑删哪个吧

补充内容 (2018-5-22 07:49):
啊 不对gap的最大就是-2147483648,2147483647,而且如果我们只考虑两两相邻差的全部累积,那么count最大也就是从-2147483648到 2147483647,因为是telescoping sum, count = A[i] -A[0] 但用long也是解得略难看了
回复

使用道具 举报

🔗
 楼主| sickcat 2018-5-22 09:41:07 | 只看该作者
全局:
阿钟 发表于 2018-5-22 06:34
也来说一下自己的思路?
首先这是一个int array,如果数列严格递增的话,A-A >=1, 那么考虑sum of A-A ...

运行你的code
[1, 3, 2] 为false, 但正确结果为true。
[1, 1, 1, 2, 3] Output:true Expected Output: false
[1, 2, 3, 4, 99, 5, 6] Output: false Expected Output: true
回复

使用道具 举报

🔗
阿钟 2018-5-22 09:49:01 | 只看该作者
全局:
sickcat 发表于 2018-5-22 09:41
运行你的code
[1, 3, 2] 为false, 但正确结果为true。
[1, 1, 1, 2, 3] Output:true Expected Outpu ...

我在我机器上运行是好的啊……

补充内容 (2018-5-22 09:52):
不过我还是没能解决overflow的问题 233 就当它是个错误解吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表