16.最接近的三數之和(LeetCode)(中等)

這題重點在於先排序,排序頂多O(n^2),然後後面控制第一個,對讓第二三個分別位於數組兩邊往中間夾,也是 O(n^2),加起來O(n^2)。如果暴力破解的話三個for循環就要O(n^3)了

class Solution {
    public int threeSumClosest(int[] nums, int target) 
    {
        Arrays.sort(nums);//java自帶快排
        int closestSum =nums[0]+nums[1]+nums[nums.length-1];
        int sum;
        for(int i=0;i<=nums.length-3;i++)//減3因爲最後三個數
        {
        	int start=i+1;//第二個數的指針從i後一位開始
        	int end=nums.length-1;//第三個數的指針從最後一位開始
        	while(start<end)
        	{
        		sum=nums[i]+nums[start]+nums[end];
        		//如果sum比target小,那麼讓sum大一點,即start加1
        		if(sum<target)
        		{
        			start=start+1;
        		}
        		//如果sum比target小,那麼讓sum大一點,即start加1
        		else if(sum>target)
        		{
        			end=end-1;
        		}
        		//一樣可以直接輸出,因爲題目假定唯一最近
        		else 
        		{
        			return sum;
        		}
        	//sum要比closestSum離target更近,才能更新cloestSum
        		if(Math.abs(sum-target)<Math.abs(closestSum-target))
        		{
        			closestSum=sum;
        		}        		
        	}
        }
        return closestSum;
        
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章