class Solution {
public int removeElement(int[] nums, int val) {
int j=0;
for(int i=0;i<nums.length;i++){
if(nums[i]!=val){
nums[j] = nums[i];
j++;
}
}
return j;
}
}
class Solution {
public int removeElement(int[] nums, int val) {
int left=0;
int right=nums.length-1;
while(left<=right){
if(nums[left]==val){
nums[left]=nums[right];
right--;
}else{
left++;
}
}
return left;
}
}
class Solution {
public void reverseString(char[] s) {
int len = s.length;
char temp;
for(int i=0;i<len/2;i++){
temp = s[i];
s[i]=s[len-i-1];
s[len-i-1]=temp;
}
}
}
class Solution {
public void reverseString(char[] s) {
int left=0;
int right=s.length-1;
while(left<right){
char temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
}
- 统计空格字符个数,扩充空间到空白字符两倍
- left与right分别指向原字符串尾部与扩充字符串尾部
- 个人认为直接调用 API(字符串那篇文章) 更为方便
- 此处不给出代码实现
- 双指针法指路
- 去除多余空白字符
- 整体反转字符串
- 局部反转字符串
- 这样做不使用内置函数
- 个人认为直接调用 API(字符串那篇文章) 更为方便
- 此处不给出代码实现
- 双指针法指路
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> ress = new ArrayList<>();
Arrays.sort(nums);
for(int i=0;i<nums.length;i++) {
if (nums[i] > 0) {
return ress;
}
if (i>0 && nums[i]==nums[i-1]){
continue;
}
int left =i+1;
int right=nums.length-1;
while(left<right){
if(nums[i]+nums[left]+nums[right]>0){
right--;
}else if(nums[i]+nums[left]+nums[right]<0){
left++;
}else{
List<Integer> res = new ArrayList<Integer>();
res.add(nums[i]);
res.add(nums[left]);
res.add(nums[right]);
ress.add(res);
while (right > left && nums[right] == nums[right - 1]) right--;
while (right > left && nums[left] == nums[left + 1]) left++;
right--;
left++;
}
}
}
return ress;
}
}
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> ress = new ArrayList<>();
Arrays.sort(nums);
for(int k=0;k<nums.length;k++){
if(k>0 && nums[k]==nums[k-1]) continue;
for(int i=k+1;i<nums.length;i++) {
if (i>k+1 && nums[i]==nums[i-1]){
continue;
}
int left =i+1;
int right=nums.length-1;
while(left<right){
if(nums[i]+nums[left]+nums[right]>(target-nums[k])){
right--;
}else if(nums[i]+nums[left]+nums[right]<(target-nums[k])){
left++;
}else{
List<Integer> res = new ArrayList<Integer>();
res.add(nums[k]);
res.add(nums[i]);
res.add(nums[left]);
res.add(nums[right]);
ress.add(res);
while (right > left && nums[right] == nums[right - 1]) right--;
while (right > left && nums[left] == nums[left + 1]) left++;
right--;
left++;
}
}
}
}
return ress;
}
}
总结
1.数组
2.字符串
3.链表
4.N数之和
5.总述
- 以上除链表使用双指针外
- 其他使用双指针都是优化机制
- 优化时间复杂度