某米笔试

package com.ksyun;

/**
 * 给定数组a, 里面的元素先严格递增后严格递减, 求最大值元素的下标
 * 时间复杂度O(logn)的查找算法
 *
 * @author xubh
 * @date 2019-03-11
 * @mondify
 * @copyright
 */
public class Test {
    public static void main(String[] args) {
        int[] nums = {1, 2, 3, 5, 4, 2, 1};
        System.out.println(findPeak(nums));
    }

    public static int findPeak(int[] nums) {
        if (nums != null && nums.length > 0) {
            if (nums.length == 1) {
                return 0;
            }
            //数组单调递减
            if (nums[0] > nums[1]) {
                return 0;
            }
            int index = nums.length - 1;
            //数组单调递增
            if (nums[index] > nums[index - 1]) {
                return index;
            }
            int start = 0;
            int end = index;
            int mid;
            //二分查找
            while (start < end) {
                mid = (start + end) / 2;
                if (nums[mid] > nums[mid - 1] && nums[mid] > nums[mid + 1]) {
                    return mid;
                } else if (nums[mid] > nums[mid + 1]) {
                    //处于下坡段, 即递减段
                    end = mid - 1;
                } else if (nums[mid] > nums[mid - 1]) {
                    //处于上坡段, 即递增段
                    start = mid + 1;
                }
            }
        }
        return -1;
    }
}
public class Test2 {

    /**
     * 输入一个整型数组,数组里有正数,也有负数。
     * 数组中一个或连续的多个整数组成一个子数组。
     * 求所有子数组的和的最大值。要求时间复杂度为O(n)
     */
    public static void main(String[] args) {
        int[] arr = {1, -2, 3, 10, -4, 7, 2, -5};
        System.out.println(maxSub(arr));
    }

    private static int maxSub(int[] arr) {
        int max = 0;
        int n = arr.length;
        int sum = 0;
        for (int i = 0; i < n; i++) {
            sum += arr[i];
            if (sum > max)
                max = sum;
            else if (sum < 0)
                sum = 0;
        }
        return max;

    }
}

推荐阅读更多精彩内容