Computer >> Máy Tính >  >> Lập trình >> Python

Chương trình để tìm ra giá trị lớn nhất của một mảng 'hợp lệ' trong Python

Giả sử, chúng ta có một mảng n số nguyên 'nums'. Mỗi giá trị trong 'nums' đại diện cho 'sức mạnh' của nó. Mảng sẽ được đánh giá là 'hợp lệ' nếu độ dài của mảng lớn hơn hai và giá trị đầu tiên và giá trị cuối cùng của mảng bằng nhau. Chúng ta phải làm cho mảng hợp lệ bằng cách xóa các phần tử khỏi mảng để phần còn lại thỏa mãn điều kiện. Ở đầu ra, chúng tôi trả về giá trị lũy thừa lớn nhất có thể của mảng bằng cách cộng tất cả các giá trị lũy thừa của mảng.

Vì vậy, nếu đầu vào là nums =[3, 4, 5, 3, 4], thì đầu ra sẽ là 16.

Nếu chúng ta xóa giá trị đầu tiên 3 khỏi số mảng, thì giá trị đó sẽ trở thành [4, 5, 3, 4]. Đây là một mảng hợp lệ và tổng lũy ​​thừa là 4 + 5 + 3 + 4 =16. Đây là tổng lớn nhất có thể cho bất kỳ mảng hợp lệ nào từ đầu vào đã cho.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • table:=a new map

  • prefix:=một danh sách mới được khởi tạo với giá trị 0

  • negative:=một danh sách mới được khởi tạo với giá trị 0

  • đối với mỗi chỉ số i và giá trị j trong nums, thực hiện

    • nếu j không có trong bảng thì

      • table [j]:=a new pair (i, 0)

      • nếu không,

        • bảng [j, -1]:=i

      • thêm một phần tử mới vào tiền tố bằng với phần tử cuối cùng của tiền tố + j

      • sao chép phần tử cuối cùng của phủ định

      • nếu j <0, thì

        • phần tử cuối cùng của phủ định:=phần tử cuối cùng của phủ định + j

  • ans:=âm vô cực

  • đối với mỗi cặp (i, j) trong tất cả các giá trị của bảng, thực hiện

    • nếu j không giống 0 thì

      • sm1:=prefix [j + 1] - prefix [i]

      • nếu j> i + 1, thì

        • sm2:=negative [j] - negative [i + 1]

      • nếu không,

        • sm2:=0

      • ans:=tối đa là (ans, sm1 - sm2)

  • trả lại ans

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

def solve(nums):
   table = {}
   prefix = [0]
   negative = [0]
   for i, j in enumerate(nums):
      if j not in table:
         table[j] = [i, 0]
      else:
         table[j][-1] = i
      prefix += prefix[-1] + j,
      negative += negative[-1],
      if j < 0:
         negative[-1] += j

   ans = float('-inf')
   for i,j in table.values():
      if j != 0:
         sm1 = prefix[j+1] - prefix[i]
         sm2 = negative[j] - negative[i+1] if j > i+1 else 0
         ans = max(ans, sm1 - sm2)
   return ans

print(solve([3, 4, 5, 3, 4]))

Đầu vào

[3, 4, 5, 3, 4]

Đầu ra

16