疑难杂题--编程

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

 

posted @ 2021-09-27 12:29  光头用沙宣  阅读(74)  评论(1编辑  收藏  举报