leetcode数据结构入门14天计划:day03

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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值