Re: [閒聊] 每日LeetCode已回收

看板Marginalman作者 (みけねこ的鼻屎)時間2年前 (2023/06/11 00:14), 編輯推噓4(400)
留言4則, 4人參與, 2年前最新討論串343/719 (看更多)
https://leetcode.com/problems/maximum-value-at-a-given-index-in-a-bounded-array/description/ 1802. Maximum Value at a Given Index in a Bounded Array 給你三個數字n, index, maxSum,我們必須找出一個陣列 nums 滿足: 1.陣列大小為n 2.陣列所有元素之和小於maxSum 3.nums[i] 和 nums[i + 1] 相差不多於1 4.nums[index] 的大小盡可能大 5.nums[i] >= 1 Example 1: Input: n = 4, index = 2, maxSum = 6 Output: 2 Explanation: nums = [1,2,2,1] is one array that satisfies all the conditions. There are no arrays that satisfy all the conditions and have nums[2] == 3, so 2 is the maximum nums[2]. Example 2: Input: n = 6, index = 1, maxSum = 10 Output: 3 思路: 1.因為nums[index]要盡可能大,他的值可能是 0 ~ maxSum,在一定的範圍中找滿足條件 的最大值我們可以使用二分搜索。 2.mid 是中間和,我們判斷他的左邊和右邊的陣列和相加之後是否小於等於 maxSum, 我們需要一個方法可以快速的求和。 3.因為中間要盡可能大又不能超過maxSum,所以旁邊必須要盡可能小,為了滿足連續的元 素要相差不為1,中心點左右兩邊的陣列值必定會是一個越往左(右) 越遞減的數列, 遞減到1之後後面都會是1(例如:5, 4, 3, ..., 1, 1, 1)。 可以分成兩個情況: 一、mid的值大於元素個數n:可以用求和公式快速找出範圍內的和 sum = (mid - n + mid) * n / 2 二、mid的值小於元素個數n:部分和用求和公式,剩下的元素全補1 sum = (mid + 1) * mid / 2 + n - mid 4.每次依照sum判斷當前的值是否不會超出maxSum,往左邊界二分查找,這邊求 mid的時候要額外 + 1,否則當範圍值為偶數時會無窮迴圈,例如: left = 8, right = 10; (left + right)/2 = 8; 5.返回左邊界。 Java Code: -------------------------------------------------------- class Solution { public int maxValue(int n, int index, int maxSum) { int left = 1; int right = maxSum; while (left < right) { int mid = (left + right + 1) / 2; long sum = getSum(mid - 1, index) + getSum(mid, n - index) ; if (sum <= maxSum) { left = mid; } else { right = mid - 1; } } return left; } private long getSum(long x, int n) { return x >= n ? (x + x - n + 1) * n / 2 : (x + 1) * x / 2 + n - x; } } -------------------------------------------------------- 二分查找 真的好難= = -- https://i.imgur.com/bFRiqA3.jpg
-- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 122.100.75.86 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1686413688.A.FB5.html

06/11 00:20, 2年前 , 1F
大師
06/11 00:20, 1F

06/11 00:24, 2年前 , 2F
大師
06/11 00:24, 2F

06/11 00:27, 2年前 , 3F
大師
06/11 00:27, 3F

06/11 01:13, 2年前 , 4F
大師
06/11 01:13, 4F
文章代碼(AID): #1aXA5u-r (Marginalman)
討論串 (同標題文章)
文章代碼(AID): #1aXA5u-r (Marginalman)