数据结构基本刷题

目录

1.两数的交集

2.买卖股票的最佳时期

3.合并两个数组


1.两数的交集

350. 两个数组的交集 II - 力扣(LeetCode) (leetcode-cn.com)icon-default.png?t=M1L8https://leetcode-cn.com/problems/intersection-of-two-arrays-ii/

题目及示例:

 解题思路①:(利用集合来解决问题)

①将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.买卖股票的最佳时期

121. 买卖股票的最佳时机 - 力扣(LeetCode) (leetcode-cn.com)icon-default.png?t=M1L8https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/

题目及示例:

 解题思路①:(利用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)icon-default.png?t=M1L8https://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];
       }
    }
    }

加油鸭~

猜你喜欢

转载自blog.csdn.net/weixin_58850105/article/details/123315953