LeetCode2150. 找出数组中的所有孤独数字
题目:给你一个整数数组 nums 。如果数字 x 在数组中仅出现 一次 ,且没有 相邻 数字(即,x + 1 和 x - 1)出现在数组中,则认为数字 x 是 孤独数字 。
返回 nums 中的 所有 孤独数字。你可以按 任何顺序 返回答案。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-all-lonely-numbers-in-the-array
解析
起初,考虑遍历整个数组,先找到是否有相同的元素,然后过滤掉后,再进行是否相邻判断。作为小白还是看了题解。借鉴了先排序之后在判断相邻之间的大小。
排序
所谓孤独数字,则除了该元素外不存在与之相等或大于或小于1的其他元素,换言之就是对数组排序后,若不是孤独元素则其相邻的元素差值必定小于等于1。
- 若nums只有一个元素,直接返回nums;
- 若nums有两个元素,则判断两个元素之间的差值的绝对值是否小于等于1。如果满足条件,直接返回nums;否则,返回空数组。
- 当nums种元素大于等于3个时,假设该元素下标为 i,根据前文可知,nums[i]为孤独数字等价于:
- nums[i] - nums[i-1] > 1;
- nums[i+1] - nums[i] > 1。
代码
/**
* @param {number[]} nums
* @return {number[]}
*/
var findLonely = function(nums) {
let res = []
let len = nums.length
if(len === 1){
return nums
}
if(len === 2 && Math.abs(nums[0]-nums[1])>1){
return nums
}
let arr = nums.sort(increase)
if(nums[1]-nums[0]>1){
res.push(nums[0])
}
if(nums[len-1]-nums[len-2]>1){
res.push(nums[len-1])
}
for(let i = 1; i < len-1; ++i){
if((nums[i]-nums[i-1])>1 && (nums[i+1]-nums[i]>1)){
res.push(nums[i])
}
}
return res
};
// 排序函数种需要传入的排序方式
function increase(a,b){
return a-b
}
总结
题解种还有一种方法:使用哈希表(map)的方式。
个人还有许多方面需要提高,简单的算法有时还是没有思路,需要查看题解。或者自己有思路时,写出的代码相对复杂。