题目:
多个有序数组
list:=[]int{5,8,9,12,67,120,500}
list2:=[]int{1,24,57,70,127,340,560}
list3:=[]int{501,570,780,1001,1367,1670,1900,2333,3456}
求数组中的数字组成的区间,包含所有的是数组,且是最小的区间
分析:
有序表实现,每次从有序表弹出最小的数,判断是在哪一个数组,这个数组中的下一个数组成新的区间是不是比之前小,依次遍历找到最小区间
list:=[]int{5,8,9,12,67,120,500}
list2:=[]int{1,24,57,70,127,340,560}
list3:=[]int{501,570,780,1001,1367,1670,1900,2333,3456}
比如上面的数组
1有序表先放入每个数组第一个数[1,5,501] 算出区间501-1
2有序表弹出1,来自第二个数组,把它的下一个数24放进数组【5,24,501】
3依次循环,找出最小区间
代码:
package main
import (
"fmt"
"sort"
)
func Search(n int, f func(int) bool) int {
// Define f(-1) == false and f(n) == true.
// Invariant: f(i-1) == false, f(j) == true.
i, j := 0, n
for i < j {
h := int(uint(i+j) >> 1) // avoid overflow when computing h
// i ≤ h < j
if !f(h) {
i = h + 1 // preserves f(i-1) == false
} else {
j = h // preserves f(j) == true
}
}
// i == j, f(i-1) == false, and f(j) (= f(i)) == true => answer is i.
return i
}
func SeachList(arr []int, x int) int {
return sort.Search(len(arr), func(i int) bool {
return arr[i] >= x
})
}
func InsertList(arr []int,n int) []int{
i:=SeachList(arr,n)
// arr[]=n
arr = append(arr, 0)
copy(arr[i+1:], arr[i:])
arr[i] = n
return arr
}
func Getmin(arr []int) (int,[]int){
i:=arr[0]
tmp:=arr[1:]
// copy(arr[0:len(arr)-1],arr[1:])
copy(tmp,arr[1:])
return i,tmp
}
func SmallestCover(n int,arrs ...[]int) int{
arr:=[][]int{}
for _,v := range arrs{
arr=append(arr,v)
}
fmt.Println(arr)
zone:=[]int{arr[0][0]}
minlenth:=len(arr[0])
for i:=1;i<n;i++{
fmt.Println(arr[i][0])
zone=(InsertList(zone,arr[i][0]))
if len(arr[i])<minlenth{
minlenth=len(arr[i])
}
}
minzone:=zone[n-1]-zone[0]
result:=minzone
fmt.Println(minlenth)
fmt.Println(zone)
fmt.Println(minzone)
for i:=0;i<minlenth;i++{
for j:=0;j<n;j++{
if zone[0]==arr[j][i]{
//删除最小
_,zone=Getmin(zone)
zone=(InsertList(zone,arr[i][j+1]))
fmt.Println(zone,i,j)
minzonetmp:=zone[n-1]-zone[0]
if minzonetmp<minzone{
minzone=minzonetmp
}
if minzone<result{
result=minzone
}
fmt.Println(minzone,result)
}
}
}
fmt.Println(result)
return result
}
func main(){
list:=[]int{5,8,9,12,67,120,500}
list2:=[]int{1,24,57,70,127,340,560}
list3:=[]int{501,570,780,1001,1367,1670,1900,2333,3456}
// fmt.Println(Getmin(list))
// zone:=[]int{0}
// fmt.Println(InsertList(zone,5))
// fmt.Println(InsertList(zone,10))
// fmt.Println(zone)
SmallestCover(3,list,list2,list3)
}