[220].存在重複元素 III

 


題目

給定一個整數數組,判斷數組中是否有兩個不同的索引 iijj,使得 nums[i]nums [i]nums[j]nums [j] 的差的絕對值最大爲 tt,並且 iijj 之間的差的絕對值最大爲 ķķ

示例 1:

輸入: nums = [1,2,3,1], k = 3, t = 0
輸出: true

示例 2:

輸入: nums = [1,0,1,1], k = 1, t = 2
輸出: true

示例 3:

輸入: nums = [1,5,9,1,5,9], k = 2, t = 3
輸出: false

 


函數原型

C 的函數原型:

bool containsNearbyAlmostDuplicate(int* nums, int numsSize, int k, int t){}

 


邊界判斷

bool containsNearbyAlmostDuplicate(int* nums, int numsSize, int k, int t){
	if( nums == NULL || numsSize == 0 )
		return false;
}

 


算法設計:查找表

思路:找一個範圍使得其值滿足某個條件,然後就會想到滑動窗口。

具體分析,猛擊《[219].存在重複元素 II》。

#include<uthash.h>		/* C語言哈希庫 */

typedef struct hash{
    int key;  // 鍵
    int index;  // 索引值
    UT_hash_handle hh; // 讓結構體哈希柄
} *hash_ptr;

bool containsNearbyAlmostDuplicate(int* nums, int numsSize, int k, int t){
    hash_ptr p = NULL, tables = NULL;
    for(int i=0; i<numsSize; i++){
    
        if( tables ) 
        	HASH_FIND_INT(tables, &(nums[i]), p);
        	
        // 改動這部分即可
        //if( p && (i-p->index) <= k ) 
        	//return true;
        	
        p=(hash_ptr)malloc(sizeof(*p));
        p->key=nums[i];
        p->index=i;
        HASH_ADD_INT(tables, key, p);
    }
    
    free(p), p = NULL;
    return false;
}
  • 時間複雜度:Θ(n)\Theta(n)
  • 空間複雜度:Θ(min(n,k))\Theta(min(n,k))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章