算法25-最小包含区间问题

题目:
多个有序数组

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)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值