LeetCode题:581. 最短无序连续子数组,242. 有效的字母异位词,202. 快乐数

简介: LeetCode题:581. 最短无序连续子数组,242. 有效的字母异位词,202. 快乐数

581. 最短无序连续子数组

题目要求:

581. 最短无序连续子数组

给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。

请你找出符合题意的 最短 子数组,并输出它的长度。

示例 1:

输入:nums = [2,6,4,8,10,9,15]

输出:5

解释:你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。


示例 2:

输入:nums = [1,2,3,4]

输出:0


示例 3:

输入:nums = [1]

输出:0


提示:

  • 1 <= nums.length <= 104
  • -105 <= nums[i] <= 105

解题思路:

我们定义一个数组num,拷贝原数组,然后对num进行升序排序,再和原数组作比较,定义left为左边第一个和原数组不相等的下标,定义right为右边第一个和原数组不相等的下标,这样我们就能找到最短子数组了,返回right - left + 1。

代码:

class Solution {
    public int findUnsortedSubarray(int[] nums) {
        int len = nums.length;
        if(len == 1) {
            return 0;
        }
        int[] num = Arrays.copyOf(nums, len);
        Arrays.sort(num);
        //左边界
        int left = 0;
        //右边界
        int right = len - 1;
        //找出左边界第一个不同的下标
        for(int i = 0; i < len; i++) {
            if(num[i] == nums[i]) {
                left++;
            } else {
                break;
            }
        }
        //遍历完了,left == len,即这个数组是有序的,则返回0
        if(left == len) return 0;
        //找右边界第一个不相等的下标
        for(int i = len - 1; i >= 0; i--) {
            if(num[i] == nums[i]) {
                right--;
            } else {
                break;
            }
        }
        return right - left + 1;
    }
}

242. 有效的字母异位词

题目要求:

242. 有效的字母异位词

给定两个字符串 st ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:st 中每个字符出现的次数都相同,则称 st 互为字母异位词。

示例 1:

输入: s = "anagram", t = "nagaram"

输出: true


示例 2:

输入: s = "rat", t = "car"

输出: false

提示:

  • 1 <= s.length, t.length <= 5 * 104
  • st 仅包含小写字母

解题思路:

定义两个数组,这两数组,每一个下标都是存放26字母的其中唯一的一个下标,分别存题目中两字符的字母个数,当遍历完 t 和 s 字符串,就比较这两数组的每一个下标都是否相等,相等就符合题目要求,不相等就不符合。

代码:

class Solution {
    public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        
        int[] numS = new int[26];
        int[] numT = new int[26];
        for(int i = 0; i < s.length(); i++) {
            numS[s.charAt(i) - 'a']++;
        }
        for(int i = 0; i < t.length(); i++) {
            numT[t.charAt(i) - 'a']++;
        }
        for(int i = 0; i < 26; i++) {
            if(numS[i] == numT[i]) {
                continue;
            } else {
                return false;
            }
        }
        return true;
    }
}

202. 快乐数

题目要求:

202. 快乐数

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。

如果 n快乐数 就返回 true ;不是,则返回 false

示例 1:

输入:n = 19

输出:true

解释:

12 + 92 = 82

82 + 22 = 68

62 + 82 = 100

12 + 02 + 02 = 1


示例 2:

输入:n = 2

输出:false


提示:

  • 1 <= n <= 231 - 1

解题思路:

题目已经告诉我们给定的n,它要么循环计算后的结果会是1,是1就返回true,要么计算的结果是无限循环的,那么肯定会计算过程中肯定会出现相同的结果,那么我们就用hash表,存放这些计算结果,如果计算的结果是1,就返回true,要是有重复出现的数字,就返回false。

代码:

class Solution {
    public boolean isHappy(int n) {
        Set<Integer> set = new HashSet<>();
        int result = 0;
        int flg;
        do {
            while(n > 0) {
                int tmp = n % 10;
                result += tmp * tmp;
                n /= 10;
            }
            if(!set.contains(result)) {
                set.add(result);
            } else {
                return false;
            }
            n = result;
            flg = result;
            result = 0;
        } while (flg != 1);
        return true;
    }
}
相关文章
|
3月前
|
存储 算法
LeetCode第49题字母异位词分组
LeetCode第49题"字母异位词分组"的解题方法,通过将每个字符串的字符排序后作为键存储在HashMap中,有效地将所有字母异位词分组。
LeetCode第49题字母异位词分组
|
1月前
|
存储
Leetcode第49题(字母异位词分组)
LeetCode第49题要求将字符串数组中的字母异位词分组,可以通过将每个字符串排序后作为键存入哈希表,最后将哈希表中的值添加到结果列表中来实现。
15 1
|
1月前
|
算法
Leetcode第十七题(电话号码的字母组合)
这篇文章介绍了如何使用深度优先搜索(DFS)算法来解决LeetCode第17题——电话号码的字母组合问题,通过递归方法生成所有可能的字母组合。
16 0
Leetcode第十七题(电话号码的字母组合)
|
1月前
|
索引
【LeetCode 11】242.有效的字母异位词
【LeetCode 11】242.有效的字母异位词
15 0
【LeetCode 11】242.有效的字母异位词
|
1月前
|
算法
【LeetCode 52】17.电话号码的字母组合
【LeetCode 52】17.电话号码的字母组合
31 0
|
3月前
|
算法
LeetCode第17题电话号码的字母组合
该文章介绍了 LeetCode 第 17 题电话号码的字母组合的解法,通过分析得出可使用递归和回溯的思想解决,避免循环穷举的高循环次数,并给出了具体的编码实现,同时总结了该题较难理解,需要了解递归的本质,当嵌套循环层次多时可考虑递归。
LeetCode第17题电话号码的字母组合
|
3月前
|
算法 Python
【Leetcode刷题Python】子数组查找
一个用于寻找给定字符串中最长重复子串的Python函数实现,采用了滑动窗口的方法来检测重复的子串。
20 1
|
3月前
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
42 0
|
4月前
|
存储 算法
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
|
5月前
|
存储 算法
力扣经典150题第四十四题:快乐数
力扣经典150题第四十四题:快乐数
25 0