代码随想录算法训练营第五天|LeetCode 242,349,202,1

目录

前言:哈希表理论基础

LeetCode 242.有效字母异位词

LeetCode 349.两个数组的交集 

LeetCode 202. 快乐数

LeetCode 1.两数之和


前言:哈希表理论基础

文章讲解:代码随想录

概念:

哈希函数:通过某种方式,把值转化为索引。

哈希表:根据关键码的值而直接进行访问的数据结构。

哈希碰撞:通过哈希函数之后,有元素映射到同一个位置。

  • 哈希碰撞的处理方法:
  • 拉链法:当元素映射到同一个位置时,在相应的位置存储到链表中。
  • 线性探测法:前提是要保证tableSize大于dataSize,当元素映射到同一个位置时,向下找有空的位置。

 LeetCode 242.有效字母异位词

文章讲解:代码随想录

视频讲解:学透哈希表,数组使用有技巧!Leetcode:242.有效的字母异位词_哔哩哔哩_bilibili

力扣题目: LeetCode 242.有效字母异位词

        

 题目分析:首先了解字母异位词的定义,我们可以有个初步的了解,如果是字母异位词,字符串s中的每个字符个数一定是与字符串t中的每个字符个数相等的。所以我们可以先把字符串s中每个字符出现的次数定义在一个以26个字符长度的数组当中。接着在看字符串t中的每个字符的个数如果是与字符串s中每个字符的个数相对应的话, 那么定义的数组当中的元素就会全部为0。

代码如下(Java):代码随想录

class Solution {
    public boolean isAnagram(String s, String t) {

        //定义一个长度位26的数组,每个位置代表一个字母
        int[] record = new int[26];

        //遍历字符串s,找到相对于的字母,并且每找到相对于的字母,就在字母的位置山加1
        for(int i = 0; i < s.length(); i++){
            record[s.charAt(i) - 'a']++;
        }

        //同上
        for(int j = 0; j < t.length(); j++){
            record[t.charAt(j) - 'a']--;
        }

        //遍历数组,若数组中还有元素不为0
        //就意味着两个字符串中的字符数量不匹配
        for(int count : record){
            if(count != 0){
                return false;
            }
        }

        return true;

    }
}

总结:通过数组下标来模拟a~z,数组中的元素来模拟字母出现的次数,再根据题目的逻辑(字母异位词的定义)即可解决该题目。


LeetCode 349.两个数组的交集 

文章讲解:代码随想录

视频讲解:学透哈希表,set使用有技巧!Leetcode:349. 两个数组的交集_哔哩哔哩_bilibili

力扣题目:力扣

 

 题目分析:比较两个数组之间是否存在着连续相同的元素,输出结果要做去重处理但是顺序不做要求。

代码如下(Java):代码随想录

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {

        if(nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0){
            return new int[0];
        }

        Set<Integer> set1 = new HashSet<>();
        Set<Integer> resSet = new HashSet<>();

        for(int i : nums1){
            set1.add(i);
        }

        for(int i : nums2){
            if(set1.contains(i)){
                resSet.add(i);
            }
        }

 //       return resSet.stream().mapToInt(x -> x).toArray();

        int[] arr = new int[resSet.size()];
        int j = 0;
        for(int i : resSet){
            arr[j++] = i;
        }

        return arr;

    }
}

 总结:因为题目返回的结果要求是去重的,但是顺序不做要求。基于这个条件下,我们可以先把其中一个数组做去重的操作,然后比较另一个也去重的数组,若两个数组之间有重复的元素,则代表有相同交集且已经做了去重的操作。


LeetCode 202. 快乐数

文章讲解:代码随想录

力扣题目:LeetCode 202. 快乐数

题目分析:快乐数的定义很容易理解,根据定义结果最后为1即为快乐数,但如果不是快乐数,就会无限循环,那么在这个过程中程序如何才知道这不是一个快乐数,需要有一个东西来判定不是快乐数,否则一直死循环且不知道结果。

代码如下(Java):代码随想录

class Solution {
    public boolean isHappy(int n) {

        Set<Integer> record = new HashSet<>();

        while(n != 1 && !record.contains(n)){
            record.add(n);
            n = getNextNumber(n);
        }

        return n == 1;
    }

    private int getNextNumber(int n){

        int res = 0;

        while(n > 0){
            int temp = n % 10;
            res += temp * temp;
            n = n / 10;
        }
        
        return res;
    }
}

LeetCode 1.两数之和

文章讲解:代码随想录

视频讲解:梦开始的地方,Leetcode:1.两数之和,学透哈希表,map使用有技巧!_哔哩哔哩_bilibili

力扣题目:LeetCode 1.两数之和

 题目分析:第一种方法可以是使用暴力解法,直接套两个for循环即可,时间复杂度为O(n²)。第二种使用哈希表来解决,当我们需要判断一个元素是否出现在集合当中的时候,就可以考虑哈希法。在哈希法中,我们又得考虑三中方法来实现哈希法,分别为:数组,set以及map。在这道题中,我们需要判断元素是否存在以及返回相对于的下标,需要两个条件,而此时map中的key对应判断元素是否存在,value对应返回的元素的下标,符合我们对该题目的要求。

暴力代码如下(Java):

class Solution {
    public int[] twoSum(int[] nums, int target) {

        int[] res = new int[2];
        int start = 0;
        int end = 1;
        int sign = 0;

        for(int i = 0; i < nums.length; i++){
            for(int j = i + 1; j < nums.length; j++){
                if(nums[i] + nums[j] == target){
                    res[start] = i;
                    res[end] = j;
                    sign = 1;
                    break;
                }
            }
            if(sign == 1){
                break;
            }
        }

        return res;
    }
}

map代码如下(Java):

class Solution {
    public int[] twoSum(int[] nums, int target) {

        int[] res = new int[2];

        if(nums == null || nums.length == 0){
            return res;
        }

        Map<Integer, Integer> map = new HashMap<>();

        for(int i = 0; i < nums.length; i++){
            int temp = target - nums[i];
            if(map.containsKey(temp)){
                res[1] = i;
                res[0] = map.get(temp);
                break;
            }

            map.put(nums[i], i);
        }

        return res;
        
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
第二十二天的算法训练营主要涵盖了Leetcode题目中的三道题目,分别是Leetcode 28 "Find the Index of the First Occurrence in a String",Leetcode 977 "有序数组的平方",和Leetcode 209 "长度最小的子数组"。 首先是Leetcode 28题,题目要求在给定的字符串中找到第一个出现的字符的索引。思路是使用双指针来遍历字符串,一个指向字符串的开头,另一个指向字符串的结尾。通过比较两个指针所指向的字符是否相等来判断是否找到了第一个出现的字符。具体实现的代码如下: ```python def findIndex(self, s: str) -> int: left = 0 right = len(s) - 1 while left <= right: if s[left == s[right]: return left left += 1 right -= 1 return -1 ``` 接下来是Leetcode 977题,题目要求对给定的有序数组中的元素进行平方,并按照非递减的顺序返回结果。这里由于数组已经是有序的,所以可以使用双指针的方法来解决问题。一个指针指向数组的开头,另一个指针指向数组的末尾。通过比较两个指针所指向的元素的绝对值的大小来确定哪个元素的平方应该放在结果数组的末尾。具体实现的代码如下: ```python def sortedSquares(self, nums: List[int]) -> List[int]: left = 0 right = len(nums) - 1 ans = [] while left <= right: if abs(nums[left]) >= abs(nums[right]): ans.append(nums[left ** 2) left += 1 else: ans.append(nums[right ** 2) right -= 1 return ans[::-1] ``` 最后是Leetcode 209题,题目要求在给定的数组中找到长度最小的子数组,使得子数组的和大于等于给定的目标值。这里可以使用滑动窗口的方法来解决问题。使用两个指针来表示滑动窗口的左边界和右边界,通过移动指针来调整滑动窗口的大小,使得滑动窗口中的元素的和满足题目要求。具体实现的代码如下: ```python def minSubArrayLen(self, target: int, nums: List[int]) -> int: left = 0 right = 0 ans = float('inf') total = 0 while right < len(nums): total += nums[right] while total >= target: ans = min(ans, right - left + 1) total -= nums[left] left += 1 right += 1 return ans if ans != float('inf') else 0 ``` 以上就是第二十二天的算法训练营的内容。通过这些题目的练习,可以提升对双指针和滑动窗口等算法的理解和应用能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值