力扣-部分排序

部分排序

8c5f8b8a038b4fa1a4bf509d6d245f0a.jpg

class Solution {
    public int[] subSort(int[] array) {
       int []a=new int[array.length];
       for(int i=0;i<array.length;i++)
       {
           a[i]=array[i];
       }
       Arrays.sort(a);
       int l=0;
       int right=array.length-1;
       int [] ans=new int[2];
       ans[0]=-1;
       ans[1]=-1;
       for(int i=0;i<array.length;i++)
       {
           if(a[i]!=array[i])
           {
               ans[0]=i;
               break;
           }
       }
        for(int i=array.length-1;i>0;i--)
       {
           if(a[i]!=array[i])
           {
               ans[1]=i;
               break;
           }
       }
       return ans;
    }
}

第二种

class Solution {
    public int[] subSort(int[] array) {
      int length=array.length;
      int m=-1;
      int n=-1;
      int []ans=new int[2];
      if(length>1)
      {
          int max=array[0];
          int min=array[length-1];
           for(int i=0;i<length;i++)
        {
          if(array[i]<max)
          {
              n=i;
          }
          else
          {
              max=array[i];
          }
        }
         for(int i=length-1;i>=0;i--)
        {
          if(array[i]>min)
          {
              m=i;
          }
          else
          {
              min=array[i];
          }
        }
      }
      
      ans[0]=m;
      ans[1]=n;
      return ans;
    }
}

这道题两种思路:

1.就是比较好理解的,就是先进行排序,然后再用双指针找出左右两端的值,最后返回

2.上面是没有根据题目的特点而是从总体上看,时间主要是在排序上。下面就是根据题目的特点。

看题目,数组的右端应该怎么找呢,实际上就是从左到右进行遍历,每次都要维护最大值,当小于最大值的时候,就更新它的右端,直到最后。

我们每次都维护最大值。因为正常的话从左到右应该都是升序,因为保留了大值,当遇到比它小的就可能是在右端,就更新。根据题目应该好理解

1 2 4 7 10 11 7 12 6 7 16 18

现在找右端,走到11都是顺利的,且当前最大值为11 到下一个7的时候小于最大值就保存它的索引,但此时最大值还是11,继续走到12,更新最大值为12走到7又更新右端,直到走完。最后保存的就是最右边7的索引,满足题意。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值