leetcode --242、217、218

242.有效的字母异构词

题目描述

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

示例 1:

输入: s = “anagram”, t = “nagaram”
输出: true

示例 2:

输入: s = “rat”, t = “car”
输出: false
说明:

你可以假设字符串只包含小写字母。

解题方法

bool isAnagram(char * s, char * t)
{
    int lens = strlen(s), lent = strlen(t);
    if (lens != lent)
        return false;
    int res[26] = {0};
    for (int i = 0; i < lens; i ++)
    {
        res[s[i] - 'a'] ++;
        res[t[i] - 'a'] --;
    }
    for (int i = 0; i < 26; i ++)
    {
        if (res[i] != 0)
        {
            return false;
        }
    }
    return true;
}

在这里插入图片描述

217.存在重复元素

题目描述

给定一个整数数组,判断是否存在重复元素。

如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。

示例 1:

输入: [1,2,3,1]
输出: true

示例 2:

输入: [1,2,3,4]
输出: false

示例 3:

输入: [1,1,1,3,3,4,3,2,4,2]
输出: true

解题方法

先排序,再判断相邻两个是否相等,但是我用自己写的快排会超时,最后使用qsort()这个函数解决了。

int partition_sum(int *a,int low,int high)
{
    int pivot=a[low];
    while(low<high){
        while(low<high&&a[high]>=pivot)high--;
        a[low]=a[high];
        while(low<high&&a[low]<=pivot)low++;
        a[high]=a[low];
    }
    a[low]=pivot;
    return low;
}
void quickSort_sum(int *a,int low,int high)
{
    if(low<high){
        int pivotpos=partition_sum(a,low,high);
        quickSort_sum(a,low,pivotpos-1);
        quickSort_sum(a,pivotpos+1,high);
    }
}

bool containsDuplicate(int* nums, int numsSize)
{
    if (numsSize == 0 || numsSize == 1)
        return false;
    quickSort_sum(nums, 0, numsSize - 1);       // 快排
    for (int i = 0; i < numsSize - 1; i ++)
    {
        if (nums[i] == nums[i+1])
            return true;
    }
    if (nums[numsSize-2] == nums[numsSize - 1])
        return true;
    return false;
}

后面ac的代码:

int cmpfunc(int *a,int *b)
{
    return(*a - *b);
}

bool containsDuplicate(int* nums, int numsSize)
{
    if(numsSize == 0 || numsSize == 1) return false;
    qsort(nums,numsSize,sizeof(int),cmpfunc);
    for(int i = 0;i<numsSize -1;i++)
    {
        if(nums[i] == nums[i+1])
        {
            return true;
        }
    }
    if (nums[numsSize-2] == nums[numsSize-1])
        return true;
    return false;
}

在这里插入图片描述

218.存在重复元素II

题目描述

给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k。

示例 1:

输入: nums = [1,2,3,1], k = 3
输出: true
示例 2:
输入: nums = [1,0,1,1], k = 1
输出: true

示例 3:

输入: nums = [1,2,3,1,2,3], k = 2
输出: false

解题方法

哈希。原本我的想法是,先哈希,用链表存储冲突元素(即数组下标),之后根据遍历所有链表,将每条链接中的元素存放在数组中,排序,再判断是否有元素之差不大于K。但是碰到越界元素不会处理了,看了题解,碰到如下方法:

bool containsNearbyDuplicate(int* nums, int numsSize, int k){
    if(numsSize==0)
    return false;
   // if(numsSize==1)
    int mark[numsSize];//Hash表
    memset(mark,-1,sizeof(int)*numsSize);
    int i,tmp;
    for(i=0;i<numsSize;i++)
    {
        tmp=nums[i]%numsSize;//Hash函数
        if(tmp<0)//转换为正数
        tmp+=(numsSize-1);
        if(mark[tmp]==-1)//没有存数
        mark[tmp]=i;//存下数组下标
        else//已经存数
        {
            while(nums[mark[tmp]]!=nums[i])//发生冲突
            {
                tmp++;tmp%=numsSize;
                if(mark[tmp]==-1)//没有存数
                mark[tmp]=i;//存下数组下标
            }
            //已经存过该数
            if(i!=mark[tmp])
                if(i-mark[tmp]<=k)//求差值
                return true;
                else
                mark[tmp]=i;
        }
    }
    return false;
}

在这里插入图片描述
参考:https://leetcode-cn.com/problems/contains-duplicate-ii/solution/chun-cjie-jue-ying-gai-shi-mu-qian-ti-jie-li-mian-/

发布了184 篇原创文章 · 获赞 253 · 访问量 34万+

猜你喜欢

转载自blog.csdn.net/williamgavin/article/details/104274232