#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const int N=1e6+10;
const ll INF=2000000000;
const int mod=998244353;
#define MaxSize 50
typedef struct node{
int data[MaxSize];
int length;
}Sqlist;
void initsize(Sqlist &L,int a[],int n){
for(int i=0;i<n;i++){
L.data[i]=a[i];
}
L.length=n;
}
void print(Sqlist L){
printf("%d\n",L.length);
for(int i=0;i<L.length;i++){
printf("%d ",L.data[i]);
}
printf("\n");
}
bool del_min(Sqlist &L,int &e){
if(L.length<=0)return false;
e=L.data[0];
int flag=0;
for(int i=1;i<L.length;i++){
if(L.data[i]<e){
flag=i;
}
}
if(flag!=L.length-1){
L.data[flag]=L.data[L.length-1];
}
L.length--;
return true;
}
int main(){
Sqlist L;
int a[50],n=10;
for(int i=0;i<n;i++){
a[i]=rand()%10+1;
}
initsize(L,a,n);
print(L);
int e=-1;
del_min(L,e);
printf("%d\n",e);
print(L);
return 0;
}
void Reverse(Sqlist &L){
int temp;
for(int i=0;i<L.length/2;i++){
temp=L.data[i];
L.data[i]=L.data[L.length-i-1];
L.data[L.length-i-1]=temp;
}
}
bool deleteElem(Sqlist &L,int x){
if(L.length<=0)return false;
int k=0;
for(int i=0;i<L.length;i++){
if(L.data[i]!=x){
L.data[k]=L.data[i];
k++;
}
}
L.length=k;
return true;
}
bool deleteElem(Sqlist &L,int s,int t){
if(L.length<=0)return false;
if(s>=t)return false;
int l=0;
while(l<L.length&&L.data[l]<s)l++;
int r=L.length-1;
while(r>=0&&L.data[r]>t)r--;
r++;
for( ;r<L.length;r++,l++){
L.data[l]=L.data[r];
}
L.length=l;
return true;
}
bool deleteElem(Sqlist &L,int s,int t){
if(L.length<=0)return false;
if(s>=t)return false;
int k=0;
for(int i=0;i<L.length;i++){
if(L.data[i]>=s&&L.data[i]<=t){
k++;
}else{
L.data[i-k]=L.data[i];
}
}
L.length-=k;
return true;
}
bool deleteElem(Sqlist &L,int s,int t){
if(L.length<=0)return false;
if(s>=t)return false;
int k=0;
for(int i=0;i<L.length;i++){
if(L.data[i]>=s&&L.data[i]<=t){
k++;
}else{
L.data[i-k]=L.data[i];
}
}
L.length-=k;
return true;
}
bool deleteElem(Sqlist &L,int s,int t){
if(L.length<=0)return false;
if(s>=t)return false;
int l=0,r=L.length-1;
while(l<r){
while(l<r&&(L.data[l]>t||L.data[l]<s))l++;
while(l<r&&L.data[r]>=s&&L.data[r]<=t)r--;
//cout<<l<<" "<<r<<endl;
int temp=L.data[l];
L.data[l]=L.data[r];
L.data[r]=temp;
}
L.length=l;
return true;
}
//有序表中删除所有值相同的元素(保留一个)
void Delete_Same(SqList &L)
{
int i, j;
for(i = 0, j = 1; j < L.length; j++)
{
if(L.data[i] != L.data[j])
L.data[++i] = L.data[j];
}
L.length = i + 1;
}
//将两个有序顺序表合并为一个有序顺序表
bool Merge(SqList A, SqList B, SqList &C)
{
if(A.length + B.length > C.MaxSize)
return false;
int i = 0, j = 0, k = 0;
for(i,j; i < A.length && j < B.length; i++, j++)
{
if(A.data[i] < B.data[j])
C.data[k++] = A.data[i];
else
C.data[k++] = B.data[j]
}
while(i < A.length)
C.data[k++] = A.data[i++];
while(j < B.length)
C.data[k++] = B.data[j++];
C.length = k;
return true;
}
void change(int a[],int n,int p){
int *b;
b=(int *)malloc(sizeof(int)*n);
memset(b,0,sizeof(b));
for(int i=p;i<n;i++){
b[i-p]=a[i];
}
for(int i=0;i<p;i++){
b[n-p+i]=a[i];
}
for(int i=0;i<n;i++){
a[i]=b[i];
}
}
//调用接口:
change(a,n+m,m);
void Reverse(int a[],int left,int right){
if(left>=right)return ;
for(int i=0;i<(right-left+1)/2;i++){
int temp=a[left+i];
a[left+i]=a[right-i];
a[right-i]=temp;
}
return ;
}
void converse(int a[],int n,int p){
Reverse(a,0,n-1);
Reverse(a,0,n-p-1);
Reverse(a,n-p,n-1);
}
void LocateElem(Sqlist &L,int x){
int l=0,r=L.length-1;
while(l<r){
int mid=(l+r)>>1;
if(L.data[mid]>=x){
r=mid;
}else{
l=mid+1;
}
}
if(L.data[l]==x){
if(l!=L.length-1){
int temp;
temp=L.data[l];
L.data[l]=L.data[l+1];
L.data[l+1]=temp;
}
}
else{
if(L.data[l]<x){
L.length++;
L.data[L.length-1]=x;
return ;
}
for(int i=L.length;i>l;i--){
L.data[i]=L.data[i-1];
}
L.data[l]=x;
L.length++;
}
}
基本设计思想:可将这个问题视作把数组ab转换成数组ba(a代表数组的前p个元素,b代表数组中余下的n-p个元素),先将a逆置,再将b逆置,最后再整体逆置得到ba。
设Reverse函数执行将数组元素逆置的操作,Reverse中两个参数分别表示数组中待转换元素的始末位置。
void Reverse(int a[],int left,int right){
if(left>=right)return ;
for(int i=0;i<(right-left+1)/2;i++){
int temp=a[left+i];
a[left+i]=a[right-i];
a[right-i]=temp;
}
return ;
}
void converse(int a[],int n,int p){
Reverse(a,0,n-1);
Reverse(a,0,n-p-1);
Reverse(a,n-p,n-1);
}
三个Reverse函数的时间复杂度分别为O(p/2)、O((n-p)/2)和O(n/2),
故所设计的算法的时间复杂度为O(n),空间复杂度为O(1)。
算法思路:
分别查找两个数组的中位数
a = b,则为中位数
a < b, 中位数在 a的数组右边,b的左边
a > b, 反之
最后分别剩1个数,较小为中位数
int M_serach(int A[],int B[],int n){
int s1=0,d1=n-1,s2=0,d2=n-1,m1,m2;
while(s1!=d1||s2!=d2){//按照代码循环两个数组会同时终止
m1=(s1+d1)>>1;
m2=(s2+d2)>>1;
if(A[m1]==B[m2]){
return A[m1];
}else if(A[m1]<B[m2]){
if((s1+d1)%2){//个数为偶数
s1=m1+1;
d2=m2;
}else{//个数为奇数
d2=m2;
s1=m1;
}
}else{
if((s2+d2)%2){//个数为偶数
s2=m2+1;
d1=m1;
}else{//个数为奇数
d1=m1;
s2=m2;
}
}
//cout<<s1<<" "<<d1<<" "<<s2<<" "<<d2<<endl;
}
return A[m1]<B[m2] ? A[m1] : B[m2];
}
类比两个有序数组排序代码:
int searchM(int A[],int B[],int n){
int i=0,j=0,k=0;
while(i<n&&j<n){
if(A[i]<B[j]){
i++;
k++;
if(k==n-1){
return A[i];
}
}else{
j++;
k++;
if(k==n-1){
return B[j];
}
}
}
}
算法思路:
出现并计数,不出现–,直到0,重新计数,最终次数大于0是备选人
再进行遍历查看出现次数
空间复杂度O1,时间复杂度On
int Majority(int a[],int n){
int c=a[0],cnt=1;
int i=1;
while(i<n){
if(a[i]==c){
cnt++;
}else{
if(cnt>0){
cnt--;
}else{
c=a[i];
cnt=1;
}
}
i++;
}
if(cnt>0){
for(int i=0;i<n;i++){
if(c==a[i]){
cnt++;
}
}
}
if(cnt*2>n)return c;
return -1;
}
int searchM(int a[],int n){
int *b;
b=(int *)malloc(sizeof(int)*(n+1));
memset(b,0,sizeof(b));
for(int i=0;i<n;i++){
if(a[i]>0&&a[i]<=n){
b[a[i]-1]=1;
}
}
int i;
for(i=0;i<n;i++){
if(!b[i]){
break;
}
}
return i+1;
}
思路图如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const ll inf=0x3f3f3f3f3f;
const ll maxn=2e5+10;
void print(int a[],int n){
for(int i=0;i<n;i++){
printf("%d ",a[i]);
}
printf("\n");
}
int abs_(int a){
return a>0 ? a : -a;
}
int xls_min(int x,int y,int z){
if(x<=y&&x<=z)return 1;
if(y<=x&&y<=z)return 2;
if(z<=x&&z<=y)return 3;
return 0;
}
int searchM(int a[],int n,int b[],int m,int c[],int p){
int D_min=inf;
int i=0,j=0,k=0;
while(i<n&&j<m&&k<p){
int D=abs_(a[i]-b[j])+abs_(a[i]-c[k])+abs_(b[j]-c[k]);
if(D<D_min)D_min=D;
int val=xls_min(a[i],b[j],c[k]);
if(val==1)i++;
else if(val==2)j++;
else k++;
}
return D_min;
}
int a[maxn]={-1,0,9},b[maxn]={-25,-10,10,11},c[maxn]={2,9,17,30,41};
int n=3,m=4,p=5;
int main()
{
printf("%d\n",searchM(a,n,b,m,c,p));
return 0;
}