疑难杂题--编程
1、最大子序和
// 当前数小于0, 跳过, 因为会对后面的和产生不好的影响
public int maxSubArray(int[] nums) {
int curNum = nums[0];
int sum = nums[0];
for (int i = 1; i < nums.length; i++) {
if (curNum < 0) {
curNum = nums[i];
} else {
curNum += nums[i];
}
if (curNum > sum) {
sum = curNum;
}
}
return sum;
}
2、最长回文子串
public String longestPalindrome(String s) {
char[] array = s.toCharArray();
int length = array.length;
if (length == 1) {
return s;
}
int winSize = length;
while (winSize >= 1) {
int left = 0;
do {
if (valid(array, left, left + winSize - 1)) {
return s.substring(left, left + winSize);
}
left++;
} while (left + winSize <= length);
winSize--;
}
return "";
}
private boolean valid(char[] array, int left, int right) {
while (left <= right) {
if (array[left] != array[right]) {
return false;
}
left++;
right--;
}
return true;
}
3、二叉树最近公共祖先
class Solution {
private TreeNode result;
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null || p == null || q == null) {
return null;
}
this.helper(root, p.val, q.val);
return result;
}
private boolean helper(TreeNode node, int valP, int valQ) {
if (node == null) {
return false;
}
boolean left = helper(node.left, valP, valQ);
boolean right = helper(node.right, valP, valQ);
if ((left && right) || ((node.val == valP || node.val == valQ) && (left || right))) {
result = node;
}
return left || right || (node.val == valP || node.val == valQ);
}
}
4、二分法求立方根
private static double func(double num) { if (num < 0) { return (-1) * func(-num); } if (num == 0 || num == 1) { return num; } double i = (num > 1) ? 1 : 0; double j = (num > 1) ? num : 1; while (j - i > 0.001) { double mid = (i + j) / 2; if (mid * mid * mid == num) { return mid; } if (mid * mid * mid < num) { i = mid; } else { j = mid; } } return j; }
心有猛虎,细嗅蔷薇

浙公网安备 33010602011771号