1.两数之和 LeetCode 1题
题解:暴力方法双层循环相加等于目标值,本例子用了HashMap把当前nums[i]当做key把index下标当做value存到map中去,在存的过程中判断目标值减去当前循环的值,是否已经在map中存在,如果存在那么就是map中的这个值加上当前循环的值等于目标值target,满足题意返回两个下标,map存的下标需要map.get(key),key就等于target - nums[i]目标值减去当前循环的值,当前的下标就是i,返回即可。理解并能想到用HashMap这种方法,HashMap在很多题解中超好用。
public static int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if (map.containsKey(target - nums[i])) {
return new int[]{map.get(target - nums[i]), i};
}
map.put(nums[i], i);
}
return nums;
2.合并两个有序链表LeetCode 21题
题解:每次递归进来比较l1和l2两个链表当前值的大小,下一个结点永远连接比较小的值,结束条件是l1和l2有一个为null,这题需要理解并能默写出来。
public ListNode mergeTwoLists1List(ListNode l1, ListNode l2) {
if(l1==null){
return l2;
}
if(l2==null){
return l1;
}
if(l1.val<l2.val){
l1.next=mergeTwoLists1List(l1.next,l2);
return l1;
}else{
l2.next=mergeTwoLists1List(l1,l2.next);
return l2;
}
}
3.盛水最多的容器 LeetCode 11题
题解:循环从两头往中间走,i++和j--到底是该i++还是j--比较好理解的是,如果a[i]和 a[j]值做比较,因为题解是需要装最多,所有肯定移动a[i]和a[j]比较小的值往中间走,因为我也不确定往中间走会不会遇到比当前值大的所以需要每次用max记录最大的值就是最多的水,当找到最中间,max就是最大值直接返回。需要很熟悉的写出来。
public static int maxArea(int a[]) {
int max = 0;
for (int i = 0, j = a.length - 1; i < j; ) {
int moveMinBar = a[i] < a[j] ? a[i++] : a[j--];
max = Math.max(max, (j - i + 1) * moveMinBar);
}
return max;
}
4.移动零 LeetCode 283题
题解:第一遍循环先把nums[i]值不是0的装到一个集合里面,题目要求需要在原数组上操作,因为原数组最坏的可能是一个0都没有,所以完全满足题意,把不等于0的值按秩序依次放到nums[j]中,放完j++,也可以写成nums[j++]。第一遍循环完,原数组的长度减去重新放值的长度i-j就是有多少个0,再从j到i循环在最后面补充0。需要第一遍知道这种解法下次要能独立写出来。
public static void moveZeroes(int[] nums) {
//第一遍只要是非0的统统都赋给nums[j]
int j=0;
for (int num : nums) {
if(num!=0){
nums[j]=num;
j++;
}
}
//替换后面的末尾的元素都赋为0即可从i-j是多少就需要在结尾补充多少个0
for(int i=j;i<nums.length;i++){
nums[i]=0;
}
}