697. 数组的度
给定一个非空且只包含非负数的整数数组 nums,数组的度的定义是指数组里任一元素出现频数的最大值。
你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/degree-of-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
fn find_shortest_sub_array(nums: Vec<i32>) -> i32 {
let mut freq:[usize;50000] = [0;50000];
let mut k :usize = 0; // 数组的度
let mut left = 0;
let mut right = 0;
let mut len;
// 统计频数
while right < nums.len() {
freq[nums[right] as usize] += 1;
if freq[nums[right] as usize] > k {
k = freq[nums[right] as usize];
}
right += 1;
}
// println!("{:?}", freq);
len = right - left;
while left < right {
// 第一个 度为K的地方
while freq[nums[left] as usize] < k {
left += 1;
if left == right {
return len as i32;
}
}
freq[nums[left] as usize] = 0;
right = nums.len();
while nums[right-1] != nums[left] {
right -= 1;
}
if right - left != 0 {
len = if len > right - left { right -left } else { len } ;
println!("left:{}, right:{}m len:{}", left, right, len);
}
if len == k {
break;
}
while nums[left] == nums[right -1] {
left +=1;
if left == right {
return len as i32;
}
}
}
println!("k:{}, len:{}", k, len);
return len as i32;
}
fn main() {
let nums = vec![1,2,2,3,1,4,2];
find_shortest_sub_array(nums);
}