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. 有效的字母异位词
给定两个字符串
s
和t
,编写一个函数来判断t
是否是s
的字母异位词。注意:若
s
和t
中每个字符出现的次数都相同,则称s
和t
互为字母异位词。示例 1:
输入: s = "anagram", t = "nagaram" 输出: true示例 2:
输入: s = "rat", t = "car" 输出: false提示:
1 <= s.length, t.length <= 5 * 104
s
和t
仅包含小写字母
解题思路:
定义两个数组,这两数组,每一个下标都是存放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提示:文章来源:https://www.toymoban.com/news/detail-753081.html
1 <= n <= 231 - 1
解题思路:
题目已经告诉我们给定的n,它要么循环计算后的结果会是1,是1就返回true,要么计算的结果是无限循环的,那么肯定会计算过程中肯定会出现相同的结果,那么我们就用hash表,存放这些计算结果,如果计算的结果是1,就返回true,要是有重复出现的数字,就返回false。文章来源地址https://www.toymoban.com/news/detail-753081.html
代码:
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;
}
}
到了这里,关于LeetCode题:581. 最短无序连续子数组,242. 有效的字母异位词,202. 快乐数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!