day18两数之和

文章介绍了如何解决LeetCode上的1.两数之和问题,提供了暴力解法和使用哈希表的优化方法。暴力解法通过两层循环查找,而哈希表方法利用键值对的特性提高效率,避免了重复计算。
摘要由CSDN通过智能技术生成

1.题目描述

 题目链接:1. 两数之和

2.题解

i.暴力解法

用两层循环遍历每个元素和其他所有元素的和,判断该和是否和目标值一样,若判断成立则将两个下标传入一个结果数组。

ii.哈希表

暴力解法的模式是找两个满足条件的数,而哈希表的模式就是已知一个数和目标值,去找另一个满足大小等于目标值减已知数的数。

这个算法的核心就是,并不是一开始就将原数组中所有元素都赋给哈希表,而是在遍历的过程中,将没有找到另一个对应数的数插入哈希表,直到最后在哈希表中找到了原数组中某个数的对应数。

考虑到赋给哈希表的数要有数及其对应的下标(且数不能重复),考虑到map中的键不重复的特性,这道题倾向于用map来解决。

3.代码示例

i.暴力解法

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int []a=new int[2];
        for(int i=0;i<nums.length;i++){
            for(int j=i+1;j<nums.length;j++){
                if(nums[i]+nums[j]==target){
                    a[0]=i;
                    a[1]=j;
                } 
            }
        }
        return a;
    }
}

ii.哈希表

public int[] twoSum(int[] nums, int target) {
    int[] result = new int[2];
    if(nums == null || nums.length == 0){
        return result;
    }
    Map<Integer, Integer> map = new HashMap<>();
    for(int i = 0; i < nums.length; i++){
        int temp = target - nums[i];//定义一个对应数满足大小等于目标值-原数组某一个元素  
        // 遍历当前元素,并在map中寻找是否有匹配的key
        if(map.containsKey(temp)){
            result[1] = i;
            result[0] = map.get(temp);
            break;
        }
        map.put(nums[i], i);// 如果没找到匹配对,就把访问过的元素和下标加入到map中
    }
    return result;
}

4.问题总结

i.关于map中键值和数组中元素下标的对应关系

本题希望得到的效果是数组中同一个元素在答案里不能重复出现。而map中的键是不重复的,因此键对应元素,值对应下标。

在R语言中,要计算从2001年到2099年的每个月份和日期的组合(MM/DD/YY格式)与年份(两位数表示)相乘的频率,你需要首先生成所有可能的日期,然后与实际年份匹配并计频。这里是一个基本的步骤: 1. 创建一个日期范围: ```R start_year <- seq(start_year, end_year, by = 1) date_format <- "%m/%d/%y" # 设置日期格式 all_dates <- data.frame(year = rep(year_range, each = days_in_month(year_range, month = 1:12)), day = rep(1:days_in_month(year_range, month = 1:12), times = length(year_range)), month = rep(month.name, each = years_in_month(year_range))) ``` 2. 将日期转换为你需要的格式(YYYY-MM-DD),然后重新排列以便每行对应一个完整的日期: ```R all_dates$year <- as.numeric(as.character(all_dates$year)) all_dates <- format(all_dates, date_format) ``` 3. 接下来,创建一个数据框存储每月的日期组合与年份的乘积及其频率: ```R product_df <- data.frame(product = str_c(all_dates$month, "/", all_dates$day, "/", all_dates$year), frequency = NA_real_) for (i in 1:nrow(product_df)) { product_df$frequency[i] <- sum((all_dates$year == substr(product_df$product[i], 4, 6))) } ``` 4. 最后,筛选出只包含有效日期的记录(即非闰年的2月29日)并计算总频率: ```R product_df <- product_df[as.Date(product_df$product, "%m/%d/%y") %in% seq.Date(min(all_dates$year), max(all_dates$year), by = "day"),] total_frequency <- sum(product_df$frequency) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值