尝试了一下取交集的话如果想不重复只能使用两个HashSet
我尝试使用一个HashSet来进行发现不会成功.......会进行两层循环,也就是时间复杂度为o(n*n)
这道题没什么要注意的要点!
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
if (nums1.length == 0 ||nums2.length == 0) {
return new int[0];
}
Set <Integer> set1 = new HashSet<>();
Set <Integer> set2 = new HashSet<>();
for(int i:nums1){
set1.add(i);
}
for(int i:nums2){
if(set1.contains(i)){
set2.add(i);
}
}
int[] arr = new int[set2.size()];
int index = 0;
for(int i:set2){
arr[index++] = i;
}
return arr;
}
}
第一种情况:无限循环------>会出现相同的数进行循环--------->HashSet如果出现重复也就是set.contains(n)那么就说明无限循环.
第二种情况:n等于1
这两种情况发生了一种就可以终止循环
那么代表循环继续的条件是n既不能等于1,又不能在无限循环中
也就是 n !=1 && !set.contains(n)
class Solution {
public boolean isHappy(int n) {
Set<Integer> set = new HashSet<>();
while(n !=1 && !set.contains(n)){
set.add(n);
n = getNextNumber(n);
}
return n == 1;
}
private int getNextNumber(int n){
int sum = 0;
while(n>0){
int temp = n % 10; 将 n 除10取余数
sum += temp*temp; 将余数的总和放在sum中
n = n / 10; 将 n 除10
}
return sum;
}
}
注意点1:如果遍历数组,增强for和普通for是有区别的!
增强for:是将nums1[ i ] 看作为 i 而普通for要写成 nums1[i] +nums[j] 才等效于i + j
for(int i:nums1){
for(int j:nums2){
map.put(i+j,map.getOrDefault(i+j,0)+1);
}
}
注意点2:map.getOrDefault(sum, a)
这一部分表示获取 map
中键 sum
对应的值,如果 sum
键不存在,就返回默认值 a
记录个数的时候可以用以下的语句 sum表示要记录的数,,,,,,,,后面表示记录的次数
map.put(sum,map.getOrDefault(sum,0)+1)
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
int count = 0;
Map<Integer,Integer> map = new HashMap<>();
for(int i:nums1){
for(int j:nums2){
map.put(i+j,map.getOrDefault(i+j,0)+1);
}
}
for(int i:nums3){
for(int j:nums4){
count += map.getOrDefault(0-i-j,0);
}
}
return count;
}
}
1.字符串转化为字符数组 使用String中的toCharArray()方法
字符数组转化为字符串使用构造方法 String(char() chars)
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
int[] arr = new int[26];
for(char a:magazine.toCharArray()){
arr[a-'a']++;
}
for(char a:ransomNote.toCharArray()){
arr[a-'a']--;
}
for(int a: arr){
if(a <= -1){
return false;
}
}
return true;
}
}
1.这段代码代表着给nums数组进行排序
Arrays.sort(nums);
如果给arrayList类型的数组进行排序,要使用Collections.sort()方法
Arrays.asList()
是一个 Java 中 Arrays 类的方法,用于将数组转换为 ArrayList
第一个if语句: 如果num[ i ]为一个正数,根据递增排序后面的数都为正数,就不用继续排序了!
注意第二个if判定要 i>0 否则i = 0时 i-1 为 -1 会引发数组指针越界问题
记得 在发现一个符合条件的三元组后 left指针与right指针都要进行改变.
二刷写代码忘记的点:
1 List <List<Integer>> res = new ArrayList<>)(); ArrayList二维数组定义方法
2 去重条件忘记填写: 而且写成了nums[ i ] == nums[ i + 1 ] 这个卡哥着重强调过,不该犯!!!
if (i > 0 && nums[i] == nums[i - 1]) { // 去重a
continue;
}
3 在填写left 与 right 去重时 要注意写上 left < right!!!!!!!!!!!
4 将数字0 写成了 字母 o
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> arr = new ArrayList<>();
for(int i = 0;i<nums.length-2;i++){
if(nums[i]>0){
return arr;
}
if(i>0&&nums[i]==nums[i-1]){
continue;
}
int left = i+1;
int right = nums.length-1;
while(left<right){
int sum = nums[i] + nums[left] + nums[right];
if(sum>0){
right--;
}else if(sum<0){
left++;
}else{
arr.add(Arrays.asList(nums[i],nums[left],nums[right]));
while(left<right&&nums[right]==nums[right-1]) right--;
while(left<right&&nums[left]==nums[left+1]) left++;
right--;
left++;
}
}
}
return arr;
}
}
1 剪枝的操作只用在 i 的for循环里面产生即可
2 对 j 去重 需要 j > i + 1
3 int 类型会溢出 long sum =(long)nums[i] +nums[j] +nums[left] +nums[right];
4 这道题是与target相比 所以 在双指针移动的过程要用 sum 与 target 相比
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
Arrays.sort(nums);
List<List<Integer>> res = new ArrayList<>();
for(int i = 0;i<nums.length-3;i++){
if(nums[i]>target&&nums[i]>0){return res;}//剪枝操作
if(i>0&&nums[i] == nums[i-1]){continue;}//对 i 去重操作
for(int j = i +1;j<nums.length-2;j++){
if(j>i+1&&nums[j] == nums[j-1]){continue;}//对 j 去重操作
int left = j+1;
int 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{
res.add(Arrays.asList(nums[i],nums[j],nums[left],nums[right]));
while(right>left&&nums[left] == nums[left+1]) left++;
while(right>left&&nums[right] == nums[right-1]) right--;
left++;
right--;
}
}
}
}
return res;
}
}