根据条件从列表中获取值对,而不重复元素

时间:2015-11-25 04:53:05

标签: python algorithm combinations

我有一个整数列表,如: 1 3 4 4 9 7 10(元素数量在1到200000之间) 和一个整数变量D,它介于0到10 ^ 9之间。 例如,让它为5。

我需要计算列表中有多少对彼此之间的差异不大于变量D但是棘手的部分如果我将零元素的值取为1且第一个值为3的元素(它们之间的差异符合条件)我不能再次使用列表中的这些元素。

例如,对于上面的序列,答案是3对:(1,3)(4,4)(7,9)

我编写了一个似乎正确的代码,但我需要提示如何更改输入序列和变量d将输出错误答案的方式

// hide all answers at first
$( '.faqAnswer' ).hide();

$( '.toggle-faq' ).on('click', function () {
    var $this = $(this);

    // if this is already open
    if ( $this.hasClass('active') ) {
        return;
    };

    // close any other already open...
    if ( !!currentSelected ) {
        currentSelected.find( '.faqAnswer' ).slideToggle( 'slow' );
    };

    // ...and then open the clicked item
    $this.find( '.faqAnswer' )
        .slideToggle( 'slow', function () {

            // now, make sure this is currentSelected
            currentSelected = $this;
        });
});

我需要另一种算法来将它与我的算法结果在输入序列的各种范围和变量d上进行比较

建议您的想法

2 个答案:

答案 0 :(得分:0)

我对这个问题有一个贪心的解决方案:

对输入序列进行排序。

按如下方式解析排序的序列:

For ith element in the sequence, 
  if |a[i+1]-a[i]| <= D, 
     then pair up the elements. Proceed to process i+2th element.
  else
     proceed to process i+1th element.

答案 1 :(得分:0)

我的解决方案是首先“清理”清单,这意味着我甚至可以创建元素数量。然后我将列表转换为元组(对)列表。 这个例子的结果是3对,以便你的条件。

list_of_colors = [1, 3, 4, 4, 9, 7, 10]
d = 5
number_of_pairs = 0
list_of_colors.sort() # the values in the list are not always sorted

# remove the last element if the number of elements is odd
if len(list_of_colors) % 2 != 0:
    list_of_colors = list_of_colors[:-1]

# create a list of tuples
list_of_colors = [tuple(list_of_colors[i:i+2]) for i in range(0, len(list_of_colors), 2)]    

for i in list_of_colors:
    if (int(i[0]) == int(i[1])) or abs(int(i[0])) - int(i[1]) <= d:
        number_of_pairs += 1

print number_of_pairs