部分排序
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的索引,满足题意。