有序矩阵查找
现在有一个行和列都排好序的矩阵,请设计一个高效算法,快速查找矩阵中是否含有值x。给定一个int矩阵mat,同时给定矩阵大小nxm及待查找的数x,请返回一个bool值,代表矩阵中是否存在x。所有矩阵中数字及x均为int范围内整数。保证n和m均小于等于1000。
测试样例: [[1,2,3],[4,5,6],[7,8,9]],3,3,10
返回:false
import java.util.*;
public class Finder {
/**
* 思路:
* 从最右开始比较,如果大于,则直接比较下一行最后一个,如果小于,则往左继续比较
**/
public boolean findX(int[][] mat, int n, int m, int x) {
for (int i = 0; i < n; i++){
for (int j = m-1; j >= 0; j--){
if (mat[i][j] == x){
return true;
}
if (mat[i][j] > x){
continue;
}
if (mat[i][j] < x){
break;
}
}
}
return false;
}
}
最短子数组
对于一个数组,请设计一个高效算法计算需要排序的最短子数组的长度。
给定一个int数组A和数组的大小n,请返回一个二元组,代表所求序列的长度。(原序列位置从0开始标号,若原序列有序,返回0)。保证A中元素均为正整数。
测试样例: [1,4,6,5,9,10],6
返回:2
public int shortestSubsequence(int[] A, int n) {
int max = A[0];
int min = A[n-1];
int rightIndex = 0, leftIndex = n-1;
//1、向右比较,如果右值大于左值,赋值,
//2、如果小于则标记右索引,直到遍历完,这就是右索引需要排序的最终点
for (int i = 1; i < n; i++){
if (max < A[i]){
max = A[i];
}
else if (max > A[i]){
rightIndex = i;
}
}
// 1、向左比较,如果左值小于右值,赋值
// 2、如果大于则标记右索引,直到遍历完,这就是右索引需要排序的最终点
for (int i = n-2; i >= 0; i--){
if (min > A[i]){
min = A[i];
}
else if (min < A[i]){
leftIndex = i;
}
}
if (rightIndex == 0 && leftIndex == n-1)
return 0;
else
return rightIndex - leftIndex+1; // 因返回许排序个数,所以距离+1;
}