ある数の範囲を示す2つの実数(left<right)からなるリスト[left_i, right_i](i=0, 1, 2・・)のリスト[[left_0, right_0],[left_1, right_1],[left_2, right_2],・・・] において、重なり合う部分の数の最大値を求めるコードを書こうとしています。
下記は、サンプルです。
a= [[-1.0, 20.0], [0.0, 14.0], [2.0, 3.0], [4.0, 9.0], [8.0, 15.0], [9.5, 15.0], [11.0, 14.0], [13.0, 14.0]]
ソートしたうえで、左から重なる部分を順次更新していくコードを書いたのですが、そうすると、上記のデータの場合、「3」という答えになり、「6」という正解にはなりません。
各範囲の組合せの全検索をして最大値を求めれば答えは出るのでしょうけれど、全検索以外の解法が思いつきません。全検索以外の方法で計算する考え方があれば教えてください。
hani_list = [[-1.0, 20.0], [0.0, 14.0], [2.0, 3.0], [4.0, 9.0], [8.0, 15.0], [9.5, 15.0], [11.0, 14.0], [13.0, 14.0]] hani_list = sorted(hani_list) cnt = 0 max_cnt = 0 flag = 0 history = [] for i, one in enumerate(hani_list): if i == 0: left, right = one[0], one[1] cnt += 1 else: if one[1] < right: left, right = one[0], one[1] cnt += 1 if max_cnt < cnt:max_cnt = cnt elif right <= one[1] and one[0] < right: left = one[0] cnt += 1 if max_cnt < cnt:max_cnt = cnt elif right < one[0]: history.append([left, right, cnt]) left, right = one[0], one[1] cnt = 1 history.append([left, right, cnt]) print('max_cnt:', max_cnt) print(history) #max_cnt: 3 #[[2.0, 3.0, 3], [8.0, 9.0, 2], [13.0, 14.0, 3]]
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/17 06:28