[lintcode] 877. 同和分割陣列 [Medium]
阿新 • • 發佈:2018-12-17
描述
給定一個有n個整數的陣列,需要找到滿足以下條件的三胞胎(i, j, k
):0 < i, i + 1 < j, j + 1 < k < n - 1
每個子陣列的和(0,i - 1), (i + 1, j - 1), (j + 1, k - 1)和(k + 1, n - 1)應該相等。我們定義子陣列(L, R)表示原始陣列從元素索引L到元素索引R的一部分。
樣例
給定 nums = [1,2,1,2,1,2,1]
, 返回 True
解釋: i = 1, j = 3, k = 5. sum(0, i - 1) = sum(0, 0) = 1 sum(i + 1, j - 1) = sum(2, 2) = 1 sum(j + 1, k - 1) = sum(4, 4) = 1 sum(k + 1, n - 1) = sum(6, 6) = 1
思路
看到題目首先想到的是那個NP-Complete問題,就是把一個數組中的數分成和相等的兩部分。但是這道題首先是資料必須連續,其次是和相等,所以想到了搜尋回溯。這道題的標籤是陣列,但是我覺得應該打dfs之類的_(┐「ε:)_。複雜度是O(n^2)。解法適用於任意n胞胎。
程式碼
class Solution { public: /** * @param nums: a list of integer * @return: return a boolean */ int leap=0; bool dfs(int start, int sum, vector<int> nums, int n) { int curSum = 0; if(leap == 4 || start > n-1) { for(int curPos = start; curPos <= n-1; ++curPos) { curSum += nums[curPos]; } if(curSum == sum) { return true; } else { return false; } } int curPos = start; curSum = nums[curPos]; while(curSum < sum && curPos <= n-4+leap) { curPos+=1; curSum += nums[curPos]; } if(curSum == sum && curPos <= n-4+leap) { leap+=2; return dfs(curPos+2, sum, nums, n); } else { return false; } } bool splitArray(vector<int> &nums) { int n = nums.size(); int sum = 0; if(n < 7) return false; for(int i=1; i<=n-6; ++i) { sum += nums[i-1]; if( dfs(i+1, sum, nums, n) ) { return true; } leap = 0; } return false; } };