四、双指针技巧(1)
头尾指针
1. 反转字符串
题目描述:
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
解题方法:【头尾指针】
解题思路:
- 头指针i,尾指针j;
- 交换元素,并同时向中间移动
- 直到达到中间位置为止
复杂度分析:
时间复杂度:O(n),n为输入字符串的长度,执行了n/2次交换
空间复杂度:O(1),临时变量
代码:
public void reverseString(char[] s) {
int i = 0;
int j = s.length -1;
while(i <= s.length/2 && j >= s.length/2){
char temp = '0';
temp = s[i];
s[i] = s[j];
s[j] = temp;
i++;
j--;
}
}
2. 数组拆分
题目描述:
给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), …, (an, bn) ,使得从 1 到 n 的 min(ai, bi) 总和最大。
返回该 最大总和 。
解题方法:
解题思路:
- 升序排列
- 遍历:两两分组,找最小值(根据 i % 2 != 0进行判断)
- 最小值相加
复杂度分析:
时间复杂度:O(nlogn),n为数组长度,为排序的时间复杂度【sort使用的是DualPivotQuicksort方法】
空间复杂度:O(logn) ,排序所需要的栈空间
代码:
public int arrayPairSum(int[] nums) {
//判断数组是否为空
if(nums.length == 0 || nums ==