java算法训练第三天

题库

一、两个数组的交集||

给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
原题

1.哈希表

选用HashMap集合;先遍历两个数组中较小的一个,把它的数据和出现的次数储存在哈希表中,然后遍历另外一个数组,如果哈希表中有该数据,则减少次数。
代码如下:

if(nums1.length > nums2.length) {
			return intersect(nums2,nums1);
		}
		Map<Integer,Integer> m = new HashMap<Integer,Integer>();
		for(int i = 0;i < nums1.length;i++) {
			int num = m.getOrDefault(nums1[i], 0) + 1;
			m.put(nums1[i], num);
		}
		int[] result = new int[nums1.length];
		int x = 0;
		for(int i = 0;i < nums2.length;i++) {
			int num = m.getOrDefault(nums2[i], 0);
			if(num > 0) {
				result[x++] = nums2[i];
				num--;
				if(num > 0) {
					m.put(nums2[i], num);
				}else {
					m.remove(nums2[i]);
				}
			}
		}
		return Arrays.copyOfRange(result, 0, x);

2.排序+双指针

设置nums1数组为较小的数组,先给两个数组进行排序,接着设置两个指针n1和n2。如果两个指针指向的元素值相等,则把元素加入到答案,并让1两个指针指向下个元素;如果不相等,则元素值较小的指针指向下个元素,直到有一个数组遍历完成。

代码如下:

if(nums1.length > nums2.length) {
			return intersect(nums2,nums1);
		}
		int n1 = 0,n2 = 0;
		Arrays.sort(nums1);
		Arrays.sort(nums2);
		int[] result = new int[nums1.length];
		int r = 0;
		while(true) {
			if(n1 == nums1.length || n2 == nums2.length)
				break;
			if(nums1[n1] == nums2[n2]) {
				result[r++] = nums1[n1++];
				n2++;
			}else {
				if(nums1[n1] > nums2[n2]) {
					n2++;
				}else {
					n1++;
				}
			}
		}
		return Arrays.copyOfRange(result, 0, r);

二、买卖股票的最佳时机

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。原题

1.个人想法(贪心思想)

由算法训练第一天遇到的"求最大子数组和"的贪心思想启发,遍历目标数组,每次只要求当前元素前面的子数组差值和是否为零,如果是则把当前元素与前一个元素计算差值并加入子数组差值,如果不是则把子数组差值归零。原题
代码如下(示例):

int maxx = 0,pre = 0;
		for(int i = 1;i < prices.length;i++) {
			if(pre < 0) {
				pre = 0;
                i--;
			}else {
				pre += (prices[i] - prices[i-1]);
				if(pre > maxx) {
					maxx = pre;
				}
			}
		}
		return maxx;

2.最低点求值

遍历数组一次,求每个元素在股票价格最低时买入能获得的利润,需要一直更新股票的最低价格和最大利润。
代码如下:

int minx = prices[0];
		int maxx = 0;
		for(int i = 1;i < prices.length;i++) {
			if(prices[i] < minx) {
				minx = prices[i];
			}else {
				if(prices[i]-minx > maxx) {
					maxx = prices[i]-minx;
				}
			}
		}
		return maxx;

总结

算法训练第三天,了解了Arrays工具类的一些方法,如:toString()方法(数组转字符串),sort()方法(对数组进行升序排序),equals()方法(判断两个数组是否相等).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值