找出一個陣列(連續遞增長度超過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 class Sample {
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 Sample {
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()); //這里是去掉長度資訊只保留上下標資訊
}
}uj5u.com熱心網友回復:
加個filter過濾一下,只保留長度超過2的結果就可以了public class Sample {
public static void main(String[] args) {
int []nums = {1,3,4,5,6,7,2,8,9,10,3,4,5,6,7,1,8,6,5};
for (int[] lu : findAllLowUpIndex(nums)) {
System.out.printf("下標:%d, 上標:%d, 長度%d\n", lu[0], lu[1], lu[1]-lu[0]+1);
}
}
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+1, new int[] {i, j}); //j-i就是長度,i是下標,j是上標,相同長度的回傳較大的index,所以后來的index直接覆寫之前的資訊
}
}
return map.entrySet().stream()
.filter(e->e.getKey()>=2) //加個過濾就可以了
.sorted((e1,e2)->e1.getKey().compareTo(e2.getKey())) //這里是為了按長度排序
.map(e->e.getValue()).collect(Collectors.toList()); //這里是去掉長度資訊只保留上下標資訊
}
}
uj5u.com熱心網友回復:
相同長度的你過濾掉了。程式運行結果為:下標:15, 上標:16, 長度2
下標:12, 上標:14, 長度3
下標:11, 上標:14, 長度4
下標:10, 上標:14, 長度5
下標:0, 上標:5, 長度6
我要的效果為:
y:0=>5
y:6=>9
y:10=>14
y:15=>16
uj5u.com熱心網友回復:
那就不需要map了(之前因為是找所有上下標才用map),直接用list保存查找結果就可以。
public class Sample {
public static void main(String[] args) {
int []nums = {1,3,4,5,6,7,2,8,9,10,3,4,5,6,7,1,8,6,5};
for (int[] lu : findAllLowUpIndex(nums)) {
System.out.printf("y:%d=>%d\n", lu[0], lu[1]);
}
}
public static List<int[]> findAllLowUpIndex(int[] nums) {
List<int[]> result = new ArrayList<>();
for (int i=0, j=0; i<nums.length-1; i=j) {
for (j=i+1; j<nums.length && nums[j-1]<nums[j]; j++);
if (j-1>i) { //長度為2以上則保存結果
result.add(new int[] {i, j-1});
}
}
return result;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/159549.html
標籤:Java EE
