文章目录
- 三数之和(15)
- 代码解答:
- 括号生成(22)
- 代码解答:
三数之和(15)
该题是让从1个数组中找到和为0的不重复的三个数,这次我们使用排序和指针的方法来解决
先将该数组从小到大进行排序
Arrays.sort(nums);
我们需要遍历一遍该数组,同时我们还要去重的操作(例如[-1,-1,-1,2],这里面满足条件的只有[-1,-1,2],但有很多种类的组合)
//去重
if(i > 0 && nums[i-1] == nums[i]){
continue;
}
这里我们还需要2个指针1个指针left指在i+1的位置,另一个指针right指在数组的最右端,让2个指针不断的向中间移动,
只要遇到nums[i]+nums[left]+nums[right] =0的情况,我们就将这3个数添加到1个集合中,同时左右指针在移动的时候也要进行去重
while(left < right){
int sum = nums[i] + nums[left] + nums[right];
if( sum == 0){
list.add(Arrays.asList(nums[i],nums[left],nums[right]));
while(left < right && nums[left] == nums[left+1]){
left++;
}
while(left < right && nums[right] == nums[right -1]){
right--;
}
left++;
right--;
}
当我们相加的sum值大于0时,说明我们有一个数太大了,我们就将right向右移动1次,尽量让sum等于0,
当我们相加的sum值小于0时,说明我们有一个数太小了,我们就将left向左移动1次,尽量让sum等于0,
}else if(sum >0){
right--;
}else{
left++;
}
代码解答:
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
if(nums == null || nums.length < 3){
return list;
}
Arrays.sort(nums);
for(int i = 0;i<nums.length;i++){
//去重
if(i > 0 && nums[i-1] == nums[i]){
continue;
}
int left = i+1;
int right = nums.length -1;
while(left < right){
int sum = nums[i] + nums[left] + nums[right];
if( sum == 0){
list.add(Arrays.asList(nums[i],nums[left],nums[right]));
while(left < right && nums[left] == nums[left+1]){
left++;
}
while(left < right && nums[right] == nums[right -1]){
right--;
}
left++;
right--;
}else if(sum >0){
right--;
}else{
left++;
}
}
}
return list;
}
}
括号生成(22)
这道题我们用剪枝和递归的方法(从B站上学会的)
我们要先理解这道题的有效括号,即(),[ ]。那么无效括号则是 ) ( …
因此我们需要先去添加左括号,再去看右括号,通过2个参数left和right来记录左右括号的个数
既然用到递归,那么就要考虑递归的终止条件,即当左右括号都满足n个时
if(left == right && right == n){
list.add(curr);
return;
}
当我们left < right 或 left > n时就说明出现无效括号
if(left > n || left < right){
return;
}
其他情况我们就需要不断递归(每次递归我们都要将对应括号的数目进行增加)
helper(curr+"(",left+1,right);
helper(curr+")",left,right+1);
代码解答:
class Solution {
List<String> list = new ArrayList<>();
int n;
public List<String> generateParenthesis(int n) {
this.n = n;
helper("",0,0);
return list;
}
public void helper(String curr,int left,int right){
if(left > n || left < right){
return;
}
if(left == right && right == n){
list.add(curr);
return;
}
helper(curr+"(",left+1,right);
helper(curr+")",left,right+1);
}
}