解题思路:
初始化指针: 左指针指向数组起始位置,右指针指向数组末尾。计算当前面积: 左右指针相遇前所围成的矩形面积。更新最大面积: 比较当前面积与已知最大面积。移动指针: 移动较高指针无法获得更大面积,故移动较低指针。
Java代码:
class Solution {
public int maxArea ( int [ ] height) {
int l = 0 , r = height. length - 1 ;
int ans = 0 ;
while ( l < r) {
int area = Math . min ( height[ l] , height[ r] ) * ( r - l) ;
ans = Math . max ( ans, area) ;
if ( height[ l] <= height[ r] ) {
l++ ;
} else {
r-- ;
}
}
return ans;
}
}
复杂度分析:
时间复杂度: 严格O(n),最多移动 n 次指针。空间复杂度: 所有额外使用的空间与输入规模无关,空间复杂度为O (1)。
解题思路:
排序: 首先对数组进行排序,便于后续处理重复元素和双指针操作。遍历数组: 使用外层循环遍历数组,固定第一个元素 nums[i]。双指针法: 对于每个固定的 nums[i],使用双指针 j(左指针)和 k(右指针)在剩余数组中寻找两个数,使得三数之和为0。跳过重复元素:
外层循环中,若当前元素与前一个元素相同,则跳过,避免重复的三元组。 内层循环中,找到有效三元组后,跳过所有与当前指针值相同的元素,防止重复。
Java代码:
class Solution {
public List < List < Integer > > threeSum ( int [ ] nums) {
List < List < Integer > > result = new ArrayList < > ( ) ;
if ( nums == null || nums. length < 3 ) return result;
Arrays . sort ( nums) ;
for ( int i = 0 ; i < nums. length - 2 ; i++ ) {
if ( i > 0 && nums[ i] == nums[ i - 1 ] ) continue ;
int j = i + 1 ;
int k = nums. length - 1 ;
while ( j < k) {
int sum = nums[ i] + nums[ j] + nums[ k] ;
if ( sum < 0 ) {
j++ ;
} else if ( sum > 0 ) {
k-- ;
} else {
result. add ( Arrays . asList ( nums[ i] , nums[ j] , nums[ k] ) ) ;
while ( j < k && nums[ j] == nums[ j + 1 ] ) j++ ;
while ( j < k && nums[ k] == nums[ k - 1 ] ) k-- ;
j++ ;
k-- ;
}
}
}
return result;
}
}
复杂度分析:
时间复杂度: 排序时间复杂度为 O(nlogn),遍历与双指针:外层循环遍历 O(n) 次,内层双指针遍历 O(n) 次,总时间复杂度为 O(
n
2
n^2
n 2 )。空间复杂度: 主要用于存储结果列表,最坏情况下空间复杂度为 O(
n
2
n^2
n 2 ),平均情况下为 O(1) 至 O(n)。