lintcode 576 · 分割数组 【中等 模拟】

题目

https://www.lintcode.com/problem/576

给你一个长度为N的整型数组arr,使用下标从0N-1,
请你选出两个数 p q 要求 0<p<q<N1 并且 q−p>1,求出arr[p]+arr[q]的最小值



5N10^5
1≤arr[i]10 ^9
 

样例
输入:[5,2,4,6,3,7]
输出:5
解释:p选1,q选4,arr[p]+arr[q]5

思路

本题难点在于如何降低时间复杂度

    求最小的三个数,如果最小的两个数相距超过1则返回它们的和;
    否则如果最小和第三小的两个数相距超过1则返回它们的和;否则返回第二小和第三小的数之和

答案

参考: https://blog.csdn.net/qq_46105170/article/details/111714575

public class Solution {
    /**
     * @param arr: an inter array
     * @return: return the min sum
     */
    public int splitArray(int[] arr) {
        //求最小的三个数,如果最小的两个数相距超过1则返回它们的和;
        // 否则如果最小和第三小的两个数相距超过1则返回它们的和;否则返回第二小和第三小的数之和
        int min1 = Integer.MAX_VALUE,min2 =Integer.MAX_VALUE,min3 =Integer.MAX_VALUE;
        int pos1 = -1,pos2=-1,pos3=-1;

        for (int i = 1; i < arr.length-1 ; i++) {
            if(arr[i] < min1) {
                min3 =min2; min2=min1;  min1=arr[i];
                pos3 =pos2;pos2 =pos1;pos1 =i;
            }else if(arr[i] < min2){
                min3 =min2;min2 = arr[i];
                pos3 = pos2;pos2=i;
            }else if(arr[i] < min3){
                min3 = arr[i];
                pos3 =i;
            }
        }

        if(Math.abs(pos1-pos2) > 1){
            return min1+min2;
        }else if(Math.abs(pos1-pos3) > 1){
            return min1+min3;
        }else{
            return min2+min3;
        }
    }
}

你可能感兴趣的:(算法)