找出一個陣列(連續遞增長度超過2的所有子集的上下標:回傳一個list儲存所有的上下標)
如:input: int []nums = {1,3,4,5,6,7,2,8,9,10,3,4,5,6,7,1,8,6,5}; ouput: list [0,5] [6,9] [10,14] [15,16]
參考之前回傳最大的:
public static void main(String[] args) {
int []nums = {1,3,4,5,6,7,2,8,9,10};
for (int[] lu : findAllLowUpIndex(nums)) {
System.out.printf("下標:%d, 上標:%d, 長度%d\n", lu[0], lu[1], lu[1]-lu[0]);
}
}
public static List<int[]> findAllLowUpIndex(int[] nums) {
Map<Integer, int[]> map = new HashMap<>(); //map的key是長度,value是陣列的上下標
for (int i=0, j=0; i<nums.length-1; i++) {
for (j=i+1; j<nums.length && nums[j-1]<nums[j]; j++) {
map.put(j-i, new int[] {i, j}); //j-i就是長度,i是下標,j是上標,相同長度的回傳較大的index,所以后來的index直接覆寫之前的資訊
}
}
return map.entrySet().stream()
.sorted((e1,e2)->e1.getKey().compareTo(e2.getKey())) //這里是為了按長度排序
.map(e->e.getValue()).collect(Collectors.toList()); //這里是去掉長度資訊只保留上下標資訊
}
}public class Test3 {
public static void main(String[] args) {
int[] nums = new int[]{5, 6, 7, 0,
1, 2, 3, 8, 4, 5, 7, 9, 21};
calc(nums);
}
public static void calc(int[] nums) {
int[] max = null;
int start = 0;
int end = 0;
for (int i = 1; i < nums.length; i++) {
int pre = nums[i - 1];
int cur = nums[i];
if (cur > pre) {
end = i;
}
if (cur <= pre || i == nums.length - 1) {
if (max == null || max[1] - max[0] <= end - start) {
max = new int[]{start, end};
}
start = i;
}
}
System.out.println(String.format("[%s,%s]", max[0], max[1]));
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/155566.html
標籤:Java EE
