轮转数组&消失的数字&移除元素&合并两个有序数组O(m+n)&同构字符串

轮转数组

来源:比特作业

189. 轮转数组 - 力扣(LeetCode)

轮转数组&消失的数字&移除元素&合并两个有序数组O(m+n)&同构字符串_第1张图片
void reverse(int* nums, int l ,int r)
{
    while(l
我想说:
  1. 很经典,做法也多。


消失的数字

来源:比特作业

面试题 17.04. 消失的数字 - 力扣(LeetCode)

轮转数组&消失的数字&移除元素&合并两个有序数组O(m+n)&同构字符串_第2张图片
int missingNumber(int* nums, int numsSize)
{
    int sum=(0+numsSize)*(numsSize+1)/2;
    for (int i=0;i
我想说:
  1. 蛮简单的,脑筋急转弯。


移除元素

来源:比特作业

27. 移除元素 - 力扣(LeetCode)

轮转数组&消失的数字&移除元素&合并两个有序数组O(m+n)&同构字符串_第3张图片
int removeElement(int* nums, int numsSize, int val)
{
    int l=0;
    int r=numsSize-1;
    int ans=numsSize;
    if (l==r)
    {
        if (nums[0]==val)
        {
            return 0;
        }
        else
        {
            return 1;
        }
    }
    while(l=0 && nums[r]==val)
        {
            r--;
            ans--;
        }
        if (r==-1)
        {
            return 0;
        }
        if (l
int removeElement(int* nums, int numsSize, int val)
{
    int j=0;
    for (int i=0;i
我想说:
  1. 上面两种方法都是双指针的方法,第一种方法的话,两个双指针是分别在头和尾,然后向中间走,第二种方法的话就是两个双指针同时指向开头,然后向后走。两种方法的复杂度与差距一目了然。


合并两个有序数组O(m+n)

来源:比特作业

88. 合并两个有序数组 - 力扣(LeetCode)

轮转数组&消失的数字&移除元素&合并两个有序数组O(m+n)&同构字符串_第4张图片
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
    int i=m-1;
    int j=n-1;
    int k=nums1Size-1;
    while(i>=0 && j>=0)
    {
        if (nums1[i]>nums2[j])
        {
            nums1[k--]=nums1[i--];
        }
        else
        {
            nums1[k--]=nums2[j--];
        }
    }
    while(j!=-1)
    {
        nums1[k--]=nums2[j--];
    }
}
我想说:
  1. 合并两个有序数组的话,当然用归并的方式也是可以的,不过我现在要求的是用时间复杂度为O(m+n)并且空间复杂度为O( 1 )的方法。


同构字符串

来源:自己LeetCode刷题

205. 同构字符串 - 力扣(LeetCode)

轮转数组&消失的数字&移除元素&合并两个有序数组O(m+n)&同构字符串_第5张图片
bool isIsomorphic(char * s, char * t)
{
    int sz=strlen(s);
    int arr1[130];
    int arr2[130];
    memset(arr1,0xff,sizeof(arr1));
    memset(arr2,0xff,sizeof(arr2));
    for (int i=0;i
我想说:
  1. 这个映射关系一定要想清楚,题目读清楚。

你可能感兴趣的:(超级刷题中心,leetcode)