更新时间: 试题数量: 购买人数: 提供作者:

有效期: 个月

章节介绍: 共有个章节

收藏
搜索
题库预览
第1题可以参考教材280页到282页的算法练习题7.2,只是算法描述中的参数名称和题目的名称有一点变化。做题时一些填空记得按题目中的参数为准调整就行,不能直接按书本的。采用折半查找算法在排序数组中查找元素的第一个位置和最后一个位置,根据下列问题描述和输入输出示例,在横线处填写相应代码。

【问题描述】:给定一个按照非递减顺序排列的整数数组nums和一个目标值target,请找出目标值在数组中的开始位置和结束位置,如果数组中不存在target,返回[-1,1]。

【输入输出示例】:

输入:nums=[5,7,7,8,8,10],target=8

输出:[3,4]

【算法描述】:

int binarySearch(int* nums,int numsSize,int target,bool lower){

//折半查找,返回nums数组中折半查找目标值的位置

int low=0,high=numsSize-1,ans=numsSize;

while(low<=high){

     int mid=       (1)      ;

     if(nums[mid]>target||(lower&&nums[mid]>=target){

    //返回数组中第一个等于目标值的位置或第一个大于目标值的位置

        high=      (2)       ;

            ans=mid;

         }//if

        else       (3)       ;

}//while

return ans;

}

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

//查找给定目标值在数组中的第一个位置和最后一个位置

int lowIdx=binarySearch(nums,numsSize,target,true);

int highIdx=      (4)       ;

int* ret=new int[sizeof(int)*2];

*returnSize=2; //返回数组ret的元素个数为2

    if(lowIdx<=highIdx&&highIdx<numsSize&&nums[lowIdx]==target&&nums

[highIdx]==target){

//存在目标值且num数组中lowIdx和highIdx的位置所存元素均为目标值

ret[0]=lowIdx,ret[1]=highIdx;

      (5)       ;

}

ret[0]=-1,ret[1]=-1;

return ret;

}

第2题可以参考教材324页算法练习题8.3

2、请合并k个升序链表,根据下列问题描述和输入输出示例,在横线处填写相应代码。

【问题描述】:给定一个链表数组,每个链表都按升序排列,要求将所有链表合并到一个升序链表中,返回合并后的链表。

【输入输出示例】:

输入:lists=[[1,4,5][1,3,4][2,6]]

输出:[1,1,2,3,4,4,5,6]

【算法描述】:

struct ListNode* MergeTwoLists(struct ListNode* list1,struct ListNode* list2){

//归并两个有序链表

struct ListNode* node=(struct ListNode*)  malloc(sizeof(struct ListNode));

struct ListNode* list3=node;

while(list1&&list2){

     if(list1->val>list2->val){//链表1的当前结点值大于链表2的当前结点值

         node->next=list2;

               (1)      ;

     }

     else{//链表1的当前结点值小于或等于链表2的当前结点值

               (2)      ;

        list1=list1->next;

     }

           (3)      ;

}//while

//将两个链表中多余的部分接到新链表的尾部

node->next=list1!=NULL?list1:list2;  

return list3->next; //返回新链表

}

struct ListNode* Merge(struct ListNode** lists,int low,int high){

//递归实现链表的合并

if(low==high) return lists[low];

if(low>high) return NULL;

int mid=       (4)      ;

return MergeTwoLists(Merge(lists,low,mid),Merge(lists,mid+1,high));

}

struct ListNode* mergeKLists(struct ListNode** lists,int listsSize){

//将k个链表合并到一个升序链表中

return       (5)       ; 

}