【LeetCode-面試演算法經典-Java實現】【011-ContainerWithMostWater(容納最多的水)】
原題
Given n non-negative integers a1, a2, …, an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.
Note: You may not slant the container.
題目大意
找兩條豎線然後這兩條線以及X軸構成的容器能容納最多的水。
解題思路
使用貪心演算法
1.首先假設我們找到能取最大容積的縱線為 i, j (假定i < j),那麼得到的最大容積 C = min( ai , aj ) * ( j- i) ;
2.下面我們看這麼一條性質:
①: 在 j 的右端沒有一條線會比它高!假設存在 k |( j < k && ak > aj) ,那麼 由 ak > aj,所以 min(ai, aj, ak) =min(ai, aj) ,所以由i, k構成的容器的容積C’ = min(ai, aj) * (k - i) > C,與C是最值矛盾,所以得證j的後邊不會有比它還高的線;
②:同理,在i的左邊也不會有比它高的線;這說明什麼呢?如果我們目前得到的候選: 設為 x, y兩條線(x< y),那麼能夠得到比它更大容積的新的兩條邊必然在[x, y]區間內並且 ax’ >= ax , ay’ >= ay;
3.所以我們從兩頭向中間靠攏,同時更新候選值;在收縮區間的時候優先從x, y中較小的邊開始收縮;
程式碼實現
public class Solution {
public int maxArea(int[] height) {
// 引數校驗
if (height == null || height.length < 2) {
return 0;
}
// 記錄最大的結果
int result = 0;
// 左邊的豎線
int left = 0;
// 右邊的豎線
int right = height.length - 1 ;
while (left < right) {
// 設算當前的最大值
result = Math.max(result, Math.min(height[left], height[right]) * (right - left));
// 如果右邊線高
if (height[left] < height[right]) {
int k = left;
// 從[left, right - 1]中,從左向右找,找第一個高度比height[left]高的位置
while (k < right && height[k] <= height[left]) {
k++;
}
// 從[left, right - 1]中,記錄第一個比原來height[left]高的位置
left = k;
}
// 左邊的線高
else {
int k = right;
// 從[left + 1, right]中,從右向左找,找第一個高度比height[right]高的位置
while (k > left && height[k] <= height[right]) {
k--;
}
// 從[left, right - 1]中,記錄第一個比原來height[right]高的位置
right = k;
}
}
return result;
}
}
評測結果
點選圖片,滑鼠不釋放,拖動一段位置,釋放後在新的視窗中檢視完整圖片。
特別說明
相關推薦
【LeetCode-面試演算法經典-Java實現】【067-Add Binary(二進位制加法)】
原題 Given two binary strings, return their sum (also a binary string). For example, a
【LeetCode-面試演算法經典-Java實現】【151-Reverse Words in a String(反轉字串中的單詞)】
原題 Given an input string, reverse the string word by word. For example, Given s = "the sky is blue", return "bl
【LeetCode-面試演算法經典-Java實現】【136-Single Number(只出現一次的數字)】
原題 Given an array of integers, every element appears twice except for one. Find that singl
【LeetCode-面試演算法經典-Java實現】【153-Find Minimum in Rotated Sorted Array(找旋轉陣列中的最小數字)】
原題 Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0
【LeetCode-面試演算法經典-Java實現】【021-Merge Two Sorted Lists(合併兩個排好序的單鏈表)】
原題 Merge two sorted linked lists and return it as a new list. The new list should be made
【LeetCode-面試演算法經典-Java實現】【019-Remove Nth Node From End of List(移除單鏈表的倒數第N個節點)】
原題 Given a linked list, remove the nth node from the end of list and return its head. F
【LeetCode-面試演算法經典-Java實現】【003-Longest Substring Without Repeating Characters(最長非重複子字串)】
原題 Given a string, find the length of the longest substring without repeating characters. For
【LeetCode-面試演算法經典-Java實現】【064-Minimum Path Sum(最小路徑和)】
原題 Given a m x n grid filled with non-negative numbers, find a path from top left to botto
【LeetCode-面試演算法經典-Java實現】【198-House Robber(搶劫犯)】
原題 You are a professional robber planning to rob houses along a street. Each house h
【LeetCode-面試演算法經典-Java實現】【142-Linked List Cycle II(單鏈表中有環II)】
原題 Given a linked list, return the node where the cycle begins. If there is no cycle, retu
【LeetCode-面試演算法經典-Java實現】【134-Gas Station(加油站問題)】
原題 There are N gas stations along a circular route, where the amount of gas at station i i
【LeetCode-面試演算法經典-Java實現】【110-Balanced Binary Tree(平衡二叉樹)】
原題 Given a binary tree, determine if it is height-balanced. For this problem, a height-
【LeetCode-面試演算法經典-Java實現】【154-Find Minimum in Rotated Sorted Array II(找旋轉陣列中的最小數字II)】
原題 Follow up for “Find Minimum in Rotated Sorted Array”: What if duplicates are allow
【LeetCode-面試演算法經典-Java實現】【206-Reverse Linked List(反轉一個單鏈表)】
原題 Reverse a singly linked list. 題目大意 反轉單鏈表。 解題思路 使用頭插法。 程式碼實現
【LeetCode-面試演算法經典-Java實現】【006-ZigZag Conversion(Z字型轉換)】
原題 The string “PAYPALISHIRING” is written in a zigzag pattern on a given number of rows
【LeetCode-面試演算法經典-Java實現】【073-Climbing Stairs(爬樓梯)】
原題 You are climbing a stair case. It takes n steps to reach to the top. Each time you c
【LeetCode-面試演算法經典-Java實現】【165-Compare Version Numbers(比較版本號)】
原題 Compare two version numbers version1 and version2. If version1 > version2 return
【LeetCode-面試演算法經典-Java實現】【002-Add Two Numbers (單鏈表表示的兩個數相加)】
原題 You are given two linked lists representing two non-negative numbers. The digits are stor
【LeetCode-面試演算法經典-Java實現】【011-ContainerWithMostWater(容納最多的水)】
原題 Given n non-negative integers a1, a2, …, an, where each represents a point at coordin
【LeetCode-面試演算法經典-Java實現】【017-Letter Combinations of a Phone Number (電話號碼上的單詞組合)】
原題 Given a digit string, return all possible letter combinations that the number could rep