(本文主要是用于个人笔记的书写,很多地方的使用可能并不专业,如需学习更加建议移步代码随想录官网代码随想录 (programmercarl.com))
一、四数相加II
第一看有一点懵,但是看了基本的文字分析后将数组两两合并统计,用hashmap判断,做起来也没毛病(其实了解了思路之后还是蛮简单的啦~~)
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
//四个可变量---》用哈希map将复杂度降低为n的平方
HashMap<Integer,Integer> hsm = new HashMap<Integer,Integer>();
int count =0;
for(int i = 0 ;i<nums1.length;i++){
for(int j = 0; j<nums2.length;j++){
int all = nums1[i]+nums2[j];
if(hsm.containsKey(all)){
int xin = hsm.get(all)+1;
hsm.put(all,xin);
}else{
hsm.put(all,1);
}
}
}
for(int i = 0;i<nums3.length;i++){
for(int j =0;j<nums4.length;j++){
int all =nums3[i]+nums4[j];
int need = -all;
if(hsm.containsKey(need)){
int have =hsm.get(need);
count=count+have;
}
}
}
return count;
}
-----》但是其中的时间复杂度有n平方,所以看看有没有更好的方法
二、383. 赎金信
好简单啊这种能用哈希数组做的题目,我竟然能一遍嘎嘎过
----》涉及到string然后关于26个字母的题目哈希数组就是吴迪的好吧
public boolean canConstruct(String ransomNote, String magazine) {
//这道题和前面的题目蛮像的诶
int[] hasarry = new int [26];//存放26个字母
for(int i =0; i<magazine.length();i++){
hasarry[magazine.charAt(i)-'a']++;
}
for(int i =0;i<ransomNote.length();i++){
if(hasarry[ransomNote.charAt(i)-'a'] ==0 ){
return false;
}else{
hasarry[ransomNote.charAt(i)-'a']--;
}
}
return true;
}
三、15. 三数之和
---反正就是做不出来...需要先看视频,
看完视频后自己也尝试写了一下,但写起来还是很麻烦
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
Arrays.sort(nums);
int left =0; int right =0;
int count = 0;
for(int i =0;i<nums.length;i++){
if (nums[i] > 0) {
return result;
}
left =i+1;
right=nums.length-1;
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}
while(left<right){
int rollleft = nums[left];
int rollright = nums[right];
if(nums[i]+nums[left]+nums[right]>0){
right--;
}else if(nums[i]+nums[left]+nums[right]<0){
left++;
}else{
result.add(Arrays.asList(nums[i], nums[left], nums[right]));
left++;right--;
if(left<right){
if(rollleft==nums[left]||rollright==nums[right]){
count--;
result.remove(Arrays.asList(nums[i], nums[left], nums[right]));
}
}
}
}
}
return result;
}
}
-------当时我的思路是既然有些值多添加到了list里面,那么就把他筛出来就行了,然后我再每次添加后还加了一个remove操作来排出重复添加的集合。但很显然,对于集合的重复填进去又拿出来是很麻烦的,所以要尽力避免其中的操作
---》代码随想录的操作直接就避免了其中的操作。直接进行判断跳过,可以舍去不断的重复操作
while (right > left && nums[right] == nums[right - 1]) right--;
while (right > left && nums[left] == nums[left + 1]) left++;