350.两个数组的交集
问题描述:
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
解题思路:
把nums1的元素作为key放进一个hashmap中,初始化value为1。如果判断出hashmap中已包含该元素则value++。这个hashmap保存了每个元素出现的次数。再用这个hashmap去匹配nums2的元素,如果匹配上了,则记录下该元素且value-1。
List list = new ArrayList<>();
Map map = new HashMap<>();
for (int i :nums1) {
if(!map.containsKey(i)){
map.put(i,1);
}else {
map.put(i,((int)map.get(i))+1);
}
}
for (int i :
nums2 ) {
if (map.containsKey(i)){
if((int)map.get(i)>0){
list.add(i);
map.put(i,((int)map.get(i))-1);
}
}
}
int[] array = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
array[i] = (int)list.get(i);
}
return array;
121.买卖股票的最佳时机
问题描述
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
解题思路
思路一
双重循环暴力破解,从头循环每一个点作为买入点,之后的每一个点作为卖出点,记录最大值。可以但是会超时。
// 思路1:双重for循环 没问题但是会超时
// static public int maxProfit(int[] prices) {
// int maxPrice = 0,temp;
// for (int minPoint = 0;minPoint<prices.length-1;minPoint++){
// for (int maxPoint = 1; maxPoint < minPoint+1 ; maxPoint++) {
// temp = prices[maxPoint]-prices[minPoint];
// if(temp>maxPrice){
// maxPrice = temp;
// }
// }
// }
//
// return maxPrice;
// }
思路二
动态规划:用一个变量记录遍历到当前的最小值,再比对当前值是否小于最小值,如果小于就更新最小值。如果不小于,那就用当前的值减去最小值比对是否大于当前记录的最大利润。如果大于就更新最大利润。
public int maxProfit(int[] prices) {
int min = prices[0],maxProfit = 0;
for (int i = 0; i < prices.length; i++) {
if (prices[i]<min){
min = prices[i];
}
else if (maxProfit<prices[i]-min){
maxProfit = prices[i]-min;
}
}
return maxProfit;
}