目录
1.两数的交集
题目及示例:
解题思路①:(利用集合来解决问题)
①将nums1中的数存入list1中
②判断在nums2中的数是否在list1中存在,若存在,则将该数存入list2中
③与此同时,删除list1中该数
代码如下:
class Solution { public int[] intersect(int[] nums1, int[] nums2) { List<Integer>list1=new ArrayList<>(); List<Integer>list2=new ArrayList<>(); for(int i=0;i<nums1.length;i++){ list1.add(nums1[i]); } for (int num : nums2) { if (list1.contains(num)) { list2.add(num); // 从 list1 除去已匹配的数值 list1.remove(Integer.valueOf(num)); } } int []tmp=new int [list2.size()]; int m=0; for(int nums:list2){ tmp[m++]=nums; }return tmp; } }
解题思路②:(利用哈希映射来解决问题)
①比较nums1和nums2的长度,若nums1.length<nums2.length,则交换两个数组
②利用Map<key,value>两值的对应关系,将nums1中的每个元素存入该哈希Map中,用count计数=value,若出现一样的key,则count++;
③利用tmp=0;来记录交集中的下标
④遍历数组nums2,如果存在nums1中含有的元素,且其表示的count>0,则将元素拷贝到num1[tmp]中,且同时让tmp++,指向下一位。
⑤令count--;减少其在HashMap中出现的次数
⑥返回nums1的前k个元素
代码如下:(代码段有详细注释可供参考)
class Solution { //交换数组的判断 public int[] intersect(int[] nums1, int[] nums2) { if (nums1.length > nums2.length) { return intersect(nums2, nums1); } //创建HashMap,并将nums1中的数存入其中 Map<Integer, Integer> map = new HashMap<Integer, Integer>(); for (int num : nums1) { int count = map.getOrDefault(num, 0) + 1; map.put(num, count); } //创建一个新的等同nums1大小的数组 int[] intersection = new int[nums1.length]; int index = 0; //判断在nums2中的数是否出现在HashMap中,并执行对应的方法 for (int num : nums2) { int count = map.getOrDefault(num, 0); if (count > 0) { intersection[index++] = num; count--; if (count > 0) { map.put(num, count); } else { map.remove(num); } } } //从下标from开始复制,复制到上标to,生成一个新的数组。注意这里包括下标from,不包括上标to。 return Arrays.copyOfRange(intersection, 0, index); } }
2.买卖股票的最佳时期
题目及示例:
解题思路①:(利用set方法来解决)
因为此处最坏的可能是0,而且要求计算的是最好的情况,所以,这里可以忽略set的元素不可重复性来进行完成
①利用暴力解法,双重循环,将每个差值添加到set当中
②当set不等于空时,直接利用Collection.max(set)来求取该集合中的最大值,因为是引用值,所以需要进行拆箱操作,然后返回它
代码如下:
class Solution { public static int maxProfit(int[] prices) { Set<Integer> set = new HashSet<>(); for (int i = 0; i < prices.length; i++) { for (int j = i + 1; j < prices.length; j++) { if (prices[i] < prices[j]) { int m = prices[j] - prices[i]; set.add(m); } } } if (!set.isEmpty()) { Integer res = Collections.max(set); return res; } else { return 0; } }
解题思路②:(利用dp动态规划来解决问题)
①找到今日买入前的最小值
②计算今日卖出的最大获利
③比较每天的获利,获取最大值
代码如下:
class Solution { public int maxProfit(int[] prices) { if(prices.length <= 1) return 0; int min = prices[0], max = 0; for(int i = 1; i < prices.length; i++) { max = Math.max(max, prices[i] - min); min = Math.min(min, prices[i]); } return max; } }
3.合并两个数组
88. 合并两个有序数组 - 力扣(LeetCode) (leetcode-cn.com)https://leetcode-cn.com/problems/merge-sorted-array/
题目及示例:
解题思路:(在前面排序(二)中归并排序中有讲解)
class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { int s1=0; int e1=m-1; int s2=0; int e2=n-1; int index=0; int []tmp=new int[m+n]; while (s1 <= e1 && s2 <= e2) { if(nums1[s1] <= nums2[s2]) { tmp[index] = nums1[s1]; index++; s1++; }else { tmp[index] = nums2[s2]; index++; s2++; } } //此时表示s2数组已经走完,把剩下的s1数组中的数依次放入合并的数组中即可 while (s1 <= e1) { tmp[index++] = nums1[s1++]; //此处也可以像上面那样写成index++;s1++; } //此时表示s1数组已经走完,把剩下的s2数组中的数依次放入合并的数组中即可 while (s2 <= e2) { tmp[index++] = nums2[s2++]; } for(int i=0;i<m+n;i++){ nums1[i]=tmp[i]; } } }
加油鸭~