今天主要做了四个题(剩了一个题,不过和第三题类似)
18:50——22:00;
学了两个主要内容:
1.map的运用
2.双指针的复杂运用
1.map——四数相加,赎金信;
就写其中的主要收获
(1)四数之和:
思路:字符2放入map,记录单个字符计入key,次数记录value; 遍历第1个字符串,每次遍历一个字符串,有则次数--,无则次数不变,并每次判断是否该key的value<0 <0则直接返回false,否则返回true;
class Solution7{
public boolean canConstruct(String ransomNote, String magazine) {
/*/*
* 思路:字符2放入map,记录单个字符计入key,次数记录value;
* 遍历第1个字符串,每次遍历一个字符串,有则次数--,无则次数不变,并每次判断是否该key的value<0
* <0则直接返回false,否则返回true
用数组更简单,思路相通
这个题注意:第二个字符串放入数组*/
int [] record=new int[26];//hash映射数组;
for(int i=0;i<magazine.length();i++){
char a=magazine.charAt(i);
record[a-'a']++;
//为什么必须要用map.getOrDefault(a,0)+1表示次数?——这样可以避免当重复字符串时,计数混乱的问题;
}
//另:string转换char:
//1.String.charAt(i);
//2.String.toCharArray();
for(int i=0;i<ransomNote.length();i++){
char b=ransomNote.charAt(i);
record[b-'a']--;
//为什么必须要用map.getOrDefault(a,0)+1表示次数?——这样可以避免当重复字符串时,计数混乱的问题;
}
for(int i:record){
if(i<0){
return false;
}
}
return true;
}
}
(2)赎金信
这个题和第一个类似,不过只是加上了一部分的字符;利用阿斯玛值即可解决;
还是必须看答案才有的思路,难啊。 * 关键思路:运用map,将两个数的和看作一个值,放入map, * 再查找剩下的两个数和的相反数是否在map中,如果在,则返回次数。 * java map相关语法: * 初始化:Map<Integer,Integer> map=new HashMap<Integer,Integer>(); * put方法,将key,value放入map:map.put(key,value) * 查找是否存在map中:getOrDefault(key,default); * 其中,defalut为未找到的默认值;注意:查找的值为key,而非value;
class Solution_5{
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
int res = 0;
for (int i : nums1) {
for (int j : nums2) {
int sum = i + j;
map.put(sum, map.getOrDefault(sum, 0) + 1);
//为什么要加一,put方法内部放入key=sum,但为什么value为次数?
//为什么不直接用map.put(sum, map.getOrDefault(sum, 1));
//存储次数意义在哪
}
}
for (int k : nums3) {
for (int l : nums4) {
res += map.getOrDefault(0 - k - l, 0);
}
}
return res;
}
}
map知识点:
寻找映射:hashmap.getOrDefault(Object key, V defaultValue);没找到则返回默认值:defaultValue 初始化map:Map<Integer, Integer> map = new HashMap<Integer, Integer>(); map.put:hashmap.put(K key,V value); map本质仍然只是一个数组,可以想象成一个序号和值相互链接的数组
2.双指针(爽指针)
题目:三数之和
先排序 * 思路上:定义三个指针,第一个(a)为固定循环指针,放在第i(i=0)位,第二个为i+1指针(b), * 第三个为末尾指针(c) * 让第二三 指针依次前移和后移,直到找到最后结果为止; * 关键点:去重: * 1.去重a:当i==i-1;continue; * 2.去重b:当i==i-1;continue; * 3.去重c:当i==i+1;continue; * 最后,得到*/
package day07;
import java.util.*;
public class threeSum_015 {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result=new ArrayList<>();
/*先排序
* 思路上:定义三个指针,第一个(a)为固定循环指针,放在第i(i=0)位,第二个为i+1指针(b),
* 第三个为末尾指针(c)
* 让第二三 指针依次前移和后移,直到找到最后结果为止;
* 关键点:去重:
* 1.去重a:当i==i-1;continue;
* 2.去重b:当i==i-1;continue;
* 3.去重c:当i==i+1;continue;
* 最后,得到*/
Arrays.sort(nums);
for(int i=0;i<nums.length;i++){
if(nums[0]>0)
return result;
//如果第一个为0,则直接结束;
int left=i+1;
int right=nums.length-1;
//去重a
if(nums[i]==nums[i-1])
continue;
while(left<right){
int sum=nums[i]+nums[left]+nums[right];
if(sum>0){
right--;
} else if (sum<0) {
left++;
}else {
result.add(Arrays.asList(nums[i], nums[left], nums[right]));
//将结果转化为数组加入到二维数组中;
while (right > left && nums[right] == nums[right - 1]) right--;
while (right > left && nums[left] == nums[left + 1]) left++;
right--;
left++;
}
}
}
return result;
}
}
总结:今天有点稍微偷懒,总用时也更长;