(LeetCode 每日一题) 2200. 找出数组中的所有 K 近邻下标 (双指针)
题目:2200. 找出数组中的所有 K 近邻下标
思路:双指针,时间复杂度0(n)。
指针j用来记录,最大的还没被标记的位置;指针i用来遍历数组nums,当nums[i]为key值,就可以将区间[max(j,i-k),i+k]之间的值加入到答案数组v当中。细节看注释
C++版本:
class Solution {
public:vector<int> findKDistantIndices(vector<int>& nums, int key, int k) {int n=nums.size();// 答案vector<int> v;// 指针j用来记录,最大的还没被标记的位置// 指针i用来遍历数组numsfor(int i=0,j=0;i<n;i++){// 当nums[i]为key值// 就可以将区间[max(j,i-k),i+k]之间的值加入到答案数组v当中if(nums[i]==key){j=max(j,i-k);while(j<n&&j-i<=k){v.push_back(j);j++;}}}return v;}
};
JAVA版本:
class Solution {public List<Integer> findKDistantIndices(int[] nums, int key, int k) {int n=nums.length;List<Integer> v=new ArrayList<>();for(int i=0,j=0;i<n;i++){if(nums[i]==key){j=Math.max(j,i-k);while(j<n&&j-i<=k){v.add(j);j++;}}}return v;}
}
Go版本:
func findKDistantIndices(nums []int, key int, k int) []int {v:=make([]int,0)n:=len(nums)for i,j:=0,0;i<n;i++ {if nums[i]==key {j=max(j,i-k)for j<n && j-i<=k {v=append(v,j)j++}}}return v
}