equal sum – Moonstone
http://www.1point3acres.com/bbs/thread-191823-1-1.html
2 一个数组里找某个index, 使sum[:i] == sum[i+1:], 也是经典题。我一开始用了O(n) space, follow up就是优化成了O(1).
这里代码写的有点慢,但都在没给提示的前提下bug free了。
3 上道题的变种,此时要求数组和带有权重,每个nums[i]需要乘以一个weight, 这个weight等于和某个index的距离。
eg:
nums = [1, 3, 5, 7, 8]
假如当前处理到nums[2], 则leftsum = 1 * 2 + 3 * 1 = 5, rightsum = 7 * 1 + 8 * 2 = 23
Read full article from equal sum – Moonstone
http://www.1point3acres.com/bbs/thread-191823-1-1.html
2 一个数组里找某个index, 使sum[:i] == sum[i+1:], 也是经典题。我一开始用了O(n) space, follow up就是优化成了O(1).
这里代码写的有点慢,但都在没给提示的前提下bug free了。
3 上道题的变种,此时要求数组和带有权重,每个nums[i]需要乘以一个weight, 这个weight等于和某个index的距离。
eg:
nums = [1, 3, 5, 7, 8]
假如当前处理到nums[2], 则leftsum = 1 * 2 + 3 * 1 = 5, rightsum = 7 * 1 + 8 * 2 = 23
public int EqualSum(int[] input){ if ((input == null) || (input.Length <= 1)) { return -1; } int sum = 0; int len = input.Length; for (int i = 0; i < len; i++) { sum += input[i]; } if (sum % 2 == 1) { return -1; } int halfSum = sum / 2; int s = 0; int j = 0; while (j < len) { s += input[j]; if (s == halfSum) { return j; } j++; } return j;}public int EqualSumWithWeigh(int[] input){ if ((input == null) || (input.Length <= 1)) { return -1; } int sum = 0; int len = input.Length; int[] p = new int[len]; for (int i = 0; i < len; i++) { sum += input[i]; p[i] = sum; } int k = 0; int leftSum = 0; int rightSum = 0; int j = k + 1; while (j < len) { rightSum += (j - k) * input[j]; j++; } while (k <= len) { if (leftSum == rightSum) { return k; } k++; //leftSum - 0..k-1, k, k+1..N-1 leftSum += p[k - 1]; rightSum -= (p[len - 1] - p[k - 1]); } return k;}public void TestEqualSum(){ int[] input1 = new int[] { -2, 3, 2, 1, 2 }; int index1 = EqualSum(input1);}public void TestEqualSumWithWeigh(){ int[] input1 = new int[] { 1, 3, 5, 7, 8 }; int r1 = EqualSumWithWeigh(input1);}