//删除(删除链表中的第i(1<=i<=n)个位置上的结点) List *Delete(int i, List *PtrL) { List *p, *s; if(i == 1) { /*如果删除的是第1个结点*/ s = PtrL; /*s指向第1个结点*/ if (PtrL != NULL) { PtrL = PtrL->Next; /*从链表中删除*/ } else { return NULL; } free(s); /*释放被删除结点*/ return PtrL; } p = FindKth(i-1, PtrL); if (p == NULL) { /*如果要删除的结点不存在*/ printf("第%d个元素不存在", i-1); return NULL; } s = p->Next; /*s指向第i个结点*/ if (s->Next == NULL) { /*如果删除的是最后1个元素*/ p = FindKth(i-1, PtrL); free(s); return NULL; } else { p->Next = s->Next; /*从链表中删除*/ free(s); /*释放被删除结点*/ return PtrL; } }
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int m = nums1.size(); int n = nums2.size(); int k = (m + n + 1) / 2; double v = (double)FindKth(nums1,0,m-1,nums2,0,n-1,k); if((m+n)%2 == 0) { int k2 = k + 1; double v2 = (double)FindKth(nums1,0,m-1,nums2,0,n-1,k2); v = (v+v2) / 2; } return v; }
const BinaryNode<Etype> * OrderedSearchTree<Etype>::FindKth( int K, const BinaryNode<Etype> * T ) const { if( T == NULL ) return NULL; int LeftSize = T->Left ? T->Left->Size : 0; if( K <= LeftSize ) return FindKth( K, T->Left ); if( K == LeftSize + 1 ) return T; return FindKth( K - LeftSize - 1, T->Right ); }
int FindKth(vector<int> &nums, int start, int end, int k) { if (start == end) return nums[start]; int left = start + 1, right = end, cur = nums[start]; while (left <= right) { while (left <= right && nums[left] < cur) left ++; while (left <= right && nums[right] >= cur) right --; if (left < right) { swap(nums[left], nums[right]); } } swap(nums[start], nums[right]); if (right - start + 1 == k) return nums[right]; else if (right - start + 1 > k) return FindKth(nums, start, right - 1, k); else return FindKth(nums, right + 1, end, k - (right - start + 1)); }
List *Delete(int i,List *PtrL) { List *p,*s; if(i==1){ s = PtrL; if(PtrL!=NULL) PtrL = PtrL->Next; else return NULL; free(s); return PtrL; } p = FindKth(i-1,PtrL); if(p==NULL){ printf("第%d个结点不存在",i-1); return NULL; } else if(p->Next==NULL){ printf("第%d个节点不存在",i); return NULL; } else { s=p->Next; p->Next = s->Next; free(s); return PtrL; } }
int FindKth(vector<int>& nums1, int al, int ar, vector<int>& nums2, int bl, int br, int k) { if(al > ar) return nums2[bl+k-1]; if(bl > br) return nums1[al+k-1]; int amid = (al+ar)/2; int bmid = (bl+br)/2; if(nums1[amid] <= nums2[bmid]) { if(k <= (amid-al)+(bmid-bl)+1) return FindKth(nums1,al,ar,nums2,bl,bmid-1,k); else return FindKth(nums1,amid+1,ar,nums2,bl,br,k-(amid-al)-1); } else { if(k <= (amid-al)+(bmid-bl)+1) return FindKth(nums1,al,amid-1,nums2,bl,br,k); else return FindKth(nums1,al,ar,nums2,bmid+1,br,k-(bmid-bl)-1); } }
List *Insert(ElementType X,int i,List *PtrL) { List *p,*s; if(i==1) { s = (List *)malloc(sizeof(List)); s->Data = X; s->Next = PtrL; return s; } p = FindKth(i-1,PtrL); if(p == NULL){ printf("参数i错"); return NULL; } else { s = (List *)malloc(sizeof(List)); s->Data = X; s->Next = p->Next; p->Next = s; return PtrL; } }
//插入(在第i-1(1<=i<=n+1)个结点后插入一个值为X的新结点) List *Insert(int X, int i, List *PtrL) { List *p, *s; if (i == 1) { /*新结点插入在表头*/ s = (List*)malloc(sizeof(List)); /*申请、填装结点*/ s->Data = X; s->Next = PtrL; return s; /*返回新表头指针*/ } p = FindKth(i-1, PtrL); /*查找第i-1个结点*/ if (p == NULL) { /*第i-1个结点不存在,不能插入*/ printf("参数i错"); return NULL; } else { s = (List*)malloc(sizeof(List)); /*申请、填装结点*/ s->Data = X; s->Next = p->Next; /*新结点插入在第i-1个结点的后面*/ p->Next = s; return PtrL; } }
int findKthLargest(vector<int>& nums, int k) { int len = nums.size(); return FindKth(nums, 0, len - 1, len - k + 1); }