2015-01-21 2 views
-4

두 서브 어레이로 배열 고려 어레이 A : I는 4 개소에서이 배열을 분할 할 수분할 최소의 차분 절대 예

[3, 1, 2, 4, 3] 

는 :

P = 1, difference = |3 − 10| = 7 
    P = 2, difference = |4 − 9| = 5 
    P = 3, difference = |6 − 7| = 1 
    P = 4, difference = |10 − 3| = 7 

최소 차이는 1

이고

배열의 각 요소는 [-1,000..1,000] 범위의 정수입니다.

아래 코드는 내가 작성한 코드입니다. 내 코드는이 연습에 적합하며 주어진 입력에 맞지만 다른 경우에는 올바르지 않습니다. 나는 왜 그런지 이해하지 못한다.

def minimaldifference(a) 
    sumArr = [] 
    sumArr = sumfromstarting(a) 
    sum = sumArr.last 
    sumRev = sumFromReverse(a, sum) 

    size = sumArr.size-2 
    min = 0 
    v = 0 
    for i in 0..size 
     if(i==0) 
      min = (sumArr[i] - sumRev[i]).abs 
     else 
      v = (sumArr[i] - sumRev[i]).abs 
      if(v < min) 
       min = v 
      end 
     end 
    end 
    min 
end 

def sumfromstarting(a) 
    sumArr = [] 
    sum = 0 
    a.each do |i| 
     sum += i 
     sumArr.push(sum) 
    end 
    sumArr 
end 

def sumFromReverse(a, sum) 
    sumArr = [] 
    rsum = 0 
    a.each do |i| 
     rsum += i 
     sumArr.push(sum - i) 
    end 
    sumArr 
end 
a = [3, 1, 2, 4, 3] 
puts minimaldifference(a) 
+3

스타일과 변수 이름에 스타일을 사용하려면 camel_case를 사용해야합니다. 'sumFromReverse'는 예를 들어'sum_from_reverse'이어야합니다. 'sumArr'은'sum_arr'이어야합니다. 이것이 Ruby 방식입니다. 커뮤니티 또는 개발 팀에서 사용하는 코드를 작성하려는 경우 그 내용과 일관성을 유지하는 것이 중요합니다. 또한'sumfromstarting'은 단어를 분리하는 밑줄이 있어야합니다. 이는 가독성을 높이는 데 도움이됩니다. 또한 이름 지정 및 대문자 사용 스타일을 일관되게 유지하십시오. –

+0

투표가 취소 된 이유를 이해하지 못합니다. 좋은 질문입니다, 문제를 푸는 시도를 보여주십시오. +1 – Darkmouse

+0

이유를 모르겠 음. 아마도 적절한 입력 및 출력 샘플이 없기 때문이며, 특히 오류를 유발하는 원인을 보여주는 입력이 있습니까? 우리가 그것을 찾는 것은 우리 시대의 낭비입니다. –

답변

0

이 솔루션을 사용하려면 배열의 모든 요소가 음수가 아니어야합니다.

a = [4,1,3,1,2,4,3,1,5] 

있다면 다음과 같이 배열하는 것이 가능 파티션이이 테이블의 각 행

 Partition     Totals   Diff Abs Diff 
[4], [1,3,1,2,4,3,1,5]    [4, 20] 
[4,1], [3,1,2,4,3,1,5] [4+1, 20-1] =>[5, 19] -14  14 
[4,1,3], [1,2,4,3,1,5] [5+3, 19-3] =>[8, 16] -8  8 
[4,1,3,1], [2,4,3,1,5] [8+1, 16-1] =>[9, 15] -6  6 
[4,1,3,1,2], [4,3,1,5] [9+2, 15-2] =>[11, 13] -2  2 
[4,1,3,1,2,4], [3,1,5] [11+4, 13-4]=>[15, 9]  6  6 
[4,1,3,1,2,4,3], [1,5] [15+3, 9-3] =>[18, 6] 12  12 
[4,1,3,1,2,4,3,1], [5] [18+1, 6-1] =>[19, 5] 14  14 

가 "DIFF"는 두 세트의 합계 사이의 차이와 동일. a의 모든 요소는 음수가 아니므로이 값은 단조롭게 감소하지 않습니다. 따라서 절대적인 차이는 증가하지 않고 감소하지 않습니다. 합계의 최소 절대 차이를 얻으려면이 배열을 단계별로 따라 가야합니다. 다음 요소를 "오른쪽"배열에서 "왼쪽"배열로 이동하면 절대 차이가 증가 할 때 멈 춥니 다.

다음과 같이 코드에서이를 구현할 수 있습니다.

def minimize_difference(arr) 
    raise ArgumentError, "array must contain at least two elements" if arr.size < 2 
    left, *right = arr 
    last = left - right.reduce(:+) 
    left = [left] 
    while right.any? 
    test = last + 2*right.first 
    break if test.abs > last.abs 
    last = test 
    left << right.shift 
    end 
    [left, right, last.abs] 
end 

minimize_difference [3, 1, 2, 4, 3] 
    #=> [[3, 1, 2], [4, 3], 1] 
+0

qs를 다시 한번 확인하십시오. 숫자가 음수 일 수 있습니다. – xenres

+0

배열 요소가 음수가 아닌지 여부를 묻는 질문을 받았습니다. 너는 대답하지 않았어.배열 요소가 부정적 일 수 있음을 나타 내기 위해 * 다음 날 *에 질문을 편집 했으니 까. 나는 분명히 그 편집을 보지 못했습니다. 왜냐하면 나중에 당신이 긍정의 질문에 대답한다면 대답을 주겠다고 말했기 때문입니다. 당신은 "네"라고 대답했습니다. 그래서 나는 대답을 준비하는 시간을 낭비했습니다. –

관련 문제