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; }