15 三数之和
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
if(nums.length < 3) return result;
Arrays.sort(nums);
int left = 0;
int right = nums.length-1;
int target = 0;
for (int i = 0; nums[i]<=0&&i<nums.length-2; i++) {
if(i>0 && nums[i] == nums[i-1]) continue;
target = -nums[i];
left = i + 1;
right = nums.length-1;
while(left <= right-1){
if(nums[left] + nums[right] < target){
left++;
}else if(nums[left] + nums[right] > target){
right--;
}else{
result.add(Arrays.asList(nums[i],nums[left],nums[right]));
left++;
right--;
while(left<right && nums[left]== nums[left-1]) left++;
while(left<right && nums[right]== nums[right + 1]) right--;
}
}
}
return result;
}
18. 四数之和
延续了三数之和的三指针解法 但效果并不理想
public List<List<Integer>> fourSum(int[] nums, int target) {
Arrays.sort(nums);
List<List<Integer>> list=new ArrayList<>();
int left,right;
for (int i = 0; i < nums.length; i++) {
if(nums[i]>0&&nums[i]>target)break;
if(i>0&&nums[i]==nums[i-1])continue;
for (int j = i+1; j < nums.length; j++) {
if(j>i+1&&nums[j]==nums[j-1])continue;
left=j+1;
right=nums.length-1;
while(left<right){
Long sum=(long)nums[i]+nums[j]+nums[left]+nums[right];
if(sum>target){
right--;
}
else if(sum<target)left++;
else {
list.add(Arrays.asList(nums[i],nums[j],nums[left],nums[right]));
while(left<right&&nums[left]==nums[left+1])left++;
while(left<right&&nums[right]==nums[right-1])right--;
left++;right--;
}
}
}
}
return list;
}
344. 反转字符串
得不偿失
public void reverseString(char[] s) {
for (int i = 0; i < s.length/2; i++) {
s[i]=(char)(s[i]^s[s.length-i-1]);
s[s.length-i-1]=(char)(s[i]^s[s.length-i-1]);
s[i]=(char)(s[i]^s[s.length-i-1]);
}
}