c语言力扣刷题-数组

1.

1.给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

算法的时间复杂度应该为 O(log (m+n)) 。

示例 1:

输入:nums1 = [1,3], nums2 = [2]

输出:2.00000

解释:合并数组 = [1,2,3] ,中位数 2

示例 2:

输入:nums1 = [1,2], nums2 = [3,4]

输出:2.50000

解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size)

{

        int m = nums1Size;

        int n =  nums2Size;

        int left = (m + n + 1) / 2;

        int right = (m + n + 2) / 2;

        return (findKth(nums1,m,n,0, nums2, 0, left) + findKth(nums1,m,n,0, nums2, 0, right)) / 2.0;

}

    //i: nums1的起始位置 j: nums2的起始位置

    int findKth(int *nums1,int m,int n, int i, int*nums2 ,int j, int k)

    {

        if( i >= m) return nums2[j + k - 1];//nums1为空数组

        if( j >= n) return nums1[i + k - 1];//nums2为空数组

        if(k == 1){

         return nums1[i]<nums2[j]?nums1[i]:nums2[j]; //x>y?x:y如果x大于y则值为x

        }

        int midVal1 = (i + k / 2 - 1 < m) ? nums1[i + k / 2 - 1] :INT_MAX;

        int midVal2 = (j + k / 2 - 1 < n) ? nums2[j + k / 2 - 1] :INT_MAX;//

        if(midVal1 < midVal2){

            return findKth(nums1,m,n, i + k / 2, nums2, j , k - k / 2);

        }else{

            return findKth(nums1,m,n, i, nums2, j + k / 2 , k - k / 2);

        }        

    }

  2.

共有 n 位员工,每位员工都有一个从 0 到 n - 1 的唯一 id 。

给你一个二维整数数组 logs ,其中 logs[i] = [idi, leaveTimei] :

idi 是处理第 i 个任务的员工的 id ,且

leaveTimei 是员工完成第 i 个任务的时刻。所有 leaveTimei 的值都是 唯一 的。

注意,第 i 个任务在第 (i - 1) 个任务结束后立即开始,且第 0 个任务从时刻 0 开始。

返回处理用时最长的那个任务的员工的 id 。如果存在两个或多个员工同时满足,则返回几人中 最小 的 id 。

示例 1:

输入:n = 10, logs = [[0,3],[2,5],[0,9],[1,15]]

输出:1

解释:

任务 0 于时刻 0 开始,且在时刻 3 结束,共计 3 个单位时间。

任务 1 于时刻 3 开始,且在时刻 5 结束,共计 2 个单位时间。

任务 2 于时刻 5 开始,且在时刻 9 结束,共计 4 个单位时间。

任务 3 于时刻 9 开始,且在时刻 15 结束,共计 6 个单位时间。

时间最长的任务是任务 3 ,而 id 为 1 的员工是处理此任务的员工,所以返回 1 。

示例 2:

输入:n = 26, logs = [[1,1],[3,7],[2,12],[7,17]]

输出:3

解释:

任务 0 于时刻 0 开始,且在时刻 1 结束,共计 1 个单位时间。

任务 1 于时刻 1 开始,且在时刻 7 结束,共计 6 个单位时间。

任务 2 于时刻 7 开始,且在时刻 12 结束,共计 5 个单位时间。

任务 3 于时刻 12 开始,且在时刻 17 结束,共计 5 个单位时间。

时间最长的任务是任务 1 ,而 id 为 3 的员工是处理此任务的员工,所以返回 3 。

示例 3:

输入:n = 2, logs = [[0,10],[1,20]]

输出:0

解释:

任务 0 于时刻 0 开始,且在时刻 10 结束,共计 10 个单位时间。

任务 1 于时刻 10 开始,且在时刻 20 结束,共计 10 个单位时间。

时间最长的任务是任务 0 和 1 ,处理这两个任务的员工的 id 分别是 0 和 1 ,所以返回最小的 0 。

提示:

2 <= n <= 500

1 <= logs.length <= 500

logs[i].length == 2

0 <= idi <= n - 1

1 <= leaveTimei <= 500

idi != idi + 1

leaveTimei 按严格递增顺序排列

 

int hardestWorker(int n, int** logs, int logsSize, int* logsColSize)

{

        int y=logs[0][0],max=logs[0][1],i=0;

        for(int j=1;j<= logsSize-1;j++)

        {

             int b=logs[j][1]-logs[j-1][1];

            if(b>max)

            {

               max=b;

               y=logs[j][0];

            }

           else if(max==b)

           {

                max=b;

                if(y>logs[j][0])

                    y=logs[j][0];

           }

         

        }

        return y; 

}

2、数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9

输出:[0,1]

解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6

输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6

输出:[0,1]

int* twoSum(int* nums, int numsSize, int target, int* returnSize){

       * returnSize=2;

        int* p = (int*)malloc(sizeof(int)*2);

          for(int i=0;i<=numsSize-2;i++)

          {

               for(int j=i+1;j<=numsSize-1;j++)

               {

                    if((nums[i]+nums[j])== target)

                    {

                        p[1]=j;

                        p[0]=i;

                        break;

                    }

               }

          }

          return p;



}

                       

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值