欢迎使用CSDN-markdown编辑器

来源:互联网 发布:阿里云管理终端怎么用 编辑:程序博客网 时间:2024/06/08 13:30
int maxSubArray(vector<int>& nums) {    int max,sum=0,tmpmax = INT_MIN,start,estart,end;    for(int i=0;i<nums.size();i++) {        sum +=nums[i];        if(sum > tmpmax) {            tmpmax = sum;            start = estart;            end = i;        }        if(sum<0) {            sum=0;            estart = i+1;    }    }    return tmpmax;}int minDistance(string word1, string word2) {    int l1 = word1.size(),l2=word2.size();    int *pre = new int[l2+1];    int *cur = new int[l2+1];    memset(pre,0,sizeof(int)*(l2+1));    memset(cur,0,sizeof(int)*(l2+1));    for(int j=1;j<=l2;j++) {        cur[j] =j;    }    for(int i=1;i<=l1;i++) {        memcpy(pre,cur,sizeof(int)*(l2+1));        cur[0] = i;        for(int j=1;j<=l2;j++){            int tmp = min(cur[j-1]+1,pre[j]+1);            cur[j] = min(tmp,pre[j-1]+(word1[i-1]==word2[j-1]?0:1));        }    }    return cur[l2];}int maxIncreasingSequence(vector<int> &vec) {    int len = vec.size();    int max_len[len] = {1},pre_index[len] = {-1};    for(int i=1;i<len;++i){        int curr=vec[i];        for(int j=0;j<i;++j){            if(vec[j]<vec[i]){                int msl=max_len[j]+1;                if(msl>max_len[i]){                    max_len[i]=msl;                    pre_index[i]=j;                }            }        }    }    int maxs=0,max_idx;    for(int i=0;i<len;++i){        if(pre_index[i]>maxs){            maxs=max_len[i];            max_idx=i;        }    }    stack<int> st;    while(max_idx>=0){        st.push(vec[max_idx]);        max_idx=pre_index[max_idx];    }}int longestCommonString(string &left,string & right){    int lenLeft=left.size(),lenRight=right.size(),k;    int c[lenRight] = {0};    int start,end,len,i,j;    end=len=0;    for(i=0; i<lenLeft; i++) {        for(j=lenRight-1; j>=0; j--) {            if(left[i] == right[j]) {                if(i==0||j==0)                    c[j]=1;                else                    c[j]=c[j-1]+1;            }            else                c[j] = 0;            if(c[j] > len)            {                len=c[j];                end=j;            }        }    }    start=end-len+1;    return len;}int longestCommonSequence(string &left,string &right) {    int lenLeft=left.size(),lenRight=right.size();    int pre[lenRight+1] = {0};    int cur[lenRight+1] = {0};    for(int i=1;i<=lenLeft;i++) {        memcpy(pre,cur,sizeof(int)*(lenRight+1));        for(int j=1;j<=lenRight;j++) {            if(left[i-1] == right[j-1]) cur[j] = pre[j-1]+1;            else cur[j] = max(pre[j],cur[j-1]);        }    }    return cur[lenRight];}void prefix(const string &str,int *&pi) {    int n = str.length(),k=0;    pi = new int[n];    pi[0] =0;    for(int i=1;i<n;i++) {        while(k>0 && str[i] != str[k]) k = pi[k-1];        if(str[k] == str[i]) k++;        pi[i] = k;    }}int main() {    string P = "ababaca";    string T = "bacbababacaababaca";    int *pi = NULL;    prefix(P,pi);    int m = P.length(),n = T.length(),k=0;    for(int i=0;i<n;i++) {        while(k>0 && P[k] != T[i]) k = pi[k-1];        if(P[k] == T[i]) k++;        if (k == m)           cout<<"Pattern occurs with shift: "<<i-m+1<<endl;    }    delete [] pi;    return 0;}int lower_bound(int *array, int size, int key){    int first = 0, middle;    int half, len;    len = size;    while(len > 0) {        half = len >> 1;        middle = first + half;        if(array[middle] < key) {            first = middle + 1;            len = len-half-1;        }        else            len = half;    }    return first;}int upper_bound(int *array, int size, int key){    int first = 0, len = size-1;    int half, middle;    while(len > 0){        half = len >> 1;        middle = first + half;        if(array[middle] > key)            len = half;        else{            first = middle + 1;             len = len - half - 1;        }    }    return first;} struct ListNode {      int val;      ListNode *next;      ListNode(int x) : val(x), next(NULL) {}  };int cmp(double a,double b) {    return a>b;}int inf = 101;void dijkstra(int a[][inf],int dst[],int path[],int n) {    bool *visted = new int[n];    memset(visted,0,sizeof(visited));    //init dst    visited[0] = true;    for(int i=1;i<n;i++){        int min=INT_MAX,idx;        for(int j=0;j<n;j++) {            if(!visited[j] && dst[j] <min) {                min = dst[j];                idx=j;            }        }        visited[idx] = true;        for(int j=0;j<n;j++) {            if(!visited[j] && dst[j]>dst[idx]+a[idx][j]) {                dst[j] = dst[idx]+a[idx][j];                parh[j] = idx;            }        }    }}bool bellman (int a[][inf],int dst[],int path[],int n) {    for(int i=1;i<=n-1;i++){        for(auto edge:edgelist) {            if(edge.v>edge.u+edge.weight) {                edge.v = edge.u+edge.weight            }        }    }    bool flag = true;    for(auto edge:edgelist) {        if(edge.v>edge.u+edge.weight) {            flag = false;            break;        }    }    return flag;}bool floyd(int a[][inf],int dst[],int path[],int n) {    for(int k=0;k<n;k++) {        for(int i=0;i<n;i++) {            for (int j=0;j<n;j++) {                if(a[i][j] >a[i][k] +a[k][j]) {                    a[i][j] =a[i][k] +a[k][j];                    path[i][j] =k;                }            }        }    }}void preorder(Tree *root) {    stack<Tree*> s;    while(!s.empty() || root!= NULL) {        while(root) {            Print(root);            s.push(root);            root = root->left;        }        if(!s.empty()) {            root = s.top();            s.pop();            root = root->right;        }    }}void inorder(Tree* root) {    stack<Tree*> s;    while(!s.empty() || root ) {        while(root) {            s.push(root);            root=root->left;        }        if(!s.empty()) {            root = s.top();            s.pop();            Print(root);            root = root->right;        }    }}void postorder(Tree *root) {    Tree *prev=NULL;    stack<Tree*> s;    s.push(root);    while(!s.empty()) {        Tree* cur = s.top();        if(cur->left == NULL &&cur->right == NULL || prev&&(prev == cur->left||prev == cur->right)) {            Print(root);            s.pop();            prev = cur        } else {            if(cur->right) s.push(cur->right);            if(cur->left) s.push(cur->left);        }    }}void inittree(Tree* &root,int* pre,int *in,int num) {    int i=0;    root->data = pre[0];    for(i=0;i<num;i++) {        if(pre[0] == in[i]) break;    }    if(i!=0) {        root->left = new Tree();        inittree(root->left,pre+1,in,i);    }    if(i!=num-1) {        root->right = new Tree();        inittree(root->right,pre+i+1,in+i+1,num-1-i);    }}void nextPermutation(vector<int>& nums) {        int nlen = nums.size();        if(nlen == 0 || nlen == 1) return;        int idx=-1,first_min;        for(int i = nlen-1;i>=1;i--) {            if(nums[i] > nums[i-1]) {                idx = i-1;                break;            }        }        if(idx==-1) {            for(int i=0,j=nlen-1;i<=j;i++,j--) {                swap(nums[i],nums[j]);            }        } else {            for(first_min=nlen-1;first_min>idx;first_min--)                if(nums[first_min]>nums[idx]) break;            swap(nums[idx],nums[first_min]);            for(int i=idx+1,j=nlen-1;i<j;i++,j--) {                swap(nums[i],nums[j]);            }        }        return;}vector<vector<int>> res;    vector<vector<int>> permute(vector<int>& nums) {        dfs(nums,0,nums.size()-1);        return res;    }    void dfs(vector<int> &nums,int begin,int end) {        if(begin == end) {            res.push_back(nums);            return;        }        for(int i=begin;i<=end;i++){            swap(nums[i],nums[begin]);            dfs(nums,begin+1,end);            swap(nums[i],nums[begin]);        }    }    vector<vector<int>> res;    vector<vector<int>> permuteUnique(vector<int>& nums) {        int n = nums.size();        if(!n) return res;        dfs(nums,0,n-1);        return res;    }    void dfs(vector<int> &nums, int begin,int end) {        if(begin==end) {            res.push_back(nums);            return;        }        for(int i=begin;i<=end;i++) {            if(!exist(nums,begin,i)) {                swap(nums[begin],nums[i]);                dfs(nums,begin+1,end);                swap(nums[begin],nums[i]);            }        }    }    bool exist(vector<int> &nums,int begin,int end){        for(int i=begin;i<end;i++) {            if(nums[i] == nums[end]) return true;        }        return false;    }void insertsort(int a[],int len) {    for(int i=1;i<len;i++) {        int tmp = a[i],j=i;        while(j>0 && a[j-1]>tmp) {            a[j] = a[j-1];            j--;        }        a[j] = tmp;    }}void selectsort(int *a,int len) {    for(int i=0;i<len;i++) {        int min = a[i],idx=i;        for(int j=i+1;j<len;j++) {            if(a[j] <min) {                min=a[j];                idx=j;            }        }        swap(a[i],a[idx]);    }}void bubblesort(int *a,int len) {    for(int i=0;i<len;i++) {        for(int j=1;j<len-i;j++) {            if(a[j-1] >a[j]) swap(a[j-1],a[j]);        }    }}void shellsort(int *a,int len) {    for(int h=len/2;h>0;h/=2) {        for(int i=h;i<len;i++) {            int j=i,tmp=a[i];            while(j>=h && a[j-h] >tmp){                a[j] = a[j-h];                j-=h;            }            a[j]=tmp;        }    }}void merge(int *a,int lb,int rb,int re) {    int b=lb,le = rb-1,s=0,len = re-lb+1;    int *tmp = new int[len];    while(lb<=le && rb<=re) {        if(a[lb]<a[rb]) {            tmp[s++] = a[lb++];        } else tmp[s++] = a[rb++];    }    while(lb<=le) tmp[s++] = a[lb++];    while(rb<=re) tmp[s++] = a[rb++];    for(int k=b,l=0;k<=re;) a[k++] = tmp[l++];    delete []tmp;}void mergesort(int *a,int s,int e) {    int mid = (e+s)/2;    if(s>=e) return;    mergesort(a,s,mid);    mergesort(a,mid+1,e);    merge(a,s,mid+1,e);}void quicksort(int *a,int s,int e) {    if(s>=e) return;    int i=s-1,j=s,tmp = a[e];    for(;j<e;j++) {        if(a[j]<=tmp) swap(a[++i],a[j]);    }    swap(a[++i],a[e]);    quicksort(a,s,i-1);    quicksort(a,i+1,e);}void percdown(int *a,int i, int n) {    int child,tmp;    for(tmp=a[i];i*2+1<n;i=child) {        child =i*2+1;        if(child<n-1&&a[child+1]>a[child]) child++;        if(tmp<a[child]) a[i] = a[child];        else break;    }    a[i] =tmp;}void heapsort(int *a,int len) {    for(int i=len/2;i>=0;i--) percdown(a,i,len);    for(int i=len-1;i>=0;i--) {        swap(a[0],a[i]);        percdown(a,0,i);    }}double myPow(double x, int n) {    int flag = n>0?1:0;    long m = abs((long)n);    double res = 1,base =x;    while(m>0) {        if(m&1) res *= base;        base *=base;        m>>=1;    }    return flag?res:1/res;}//最小的k个数int random(int low, int high) {      int size = high - low + 1;      return low + rand() % size;  }  void swap(int *a, int *b) {      int temp;      temp = *a;      *a = *b;      *b = temp;  }  int partition(int *a, int left, int right) {      int key = a[left];      int i = left;      int j;      for(j = i + 1; j <= right; j++) {          if(a[j] <= key) {              if(i != j) {                  i++;                  swap(&a[i], &a[j]);              }          }      }      swap(&a[i], &a[left]);      return i;  }  int random_partition(int *a, int left, int right) {      int index = random(left, right);      swap(&a[index], &a[left]);      return partition(a, left, right);  }  int randomized_select(int *a, int left, int right, int k) {      if(left < 0 || (right - left + 1) < k)          return -1;      int pos = random_partition(a, left, right);      int m = pos - left + 1;      if(k == m) {          return pos;      } else if(k < m) {          return randomized_select(a, left, pos - 1, k);      } else {          return randomized_select(a, pos + 1, right, k - m);      }  }  void main() {      int a[] = {1, 11, 23, 5, 6, 7, 20, 13, 22, 9, 34, 18};      int len = sizeof(a) / sizeof(int);      int k = 7;      randomized_select(a, 0, len - 1, k);      for(int i = 0; i < len; i++) {          printf("%d ", a[i]);      }      printf("\n");  }  //int myAtoi(string str) {    int sign = -1;    int idx = 0;    while(str[idx] == ' ') idx++;    if(str[idx] == '-') {        sign = 1;        idx += 1;    }    if(sign == -1 && str[idx] == '+') {        sign = 0;        idx += 1;    }    int res = 0;    int res2 = 0;    while(idx < str.length()) {        char c = str[idx];        idx++;        int tmp;        if(c>='0' && c <='9') tmp = c-'0';        else break;        res2 = res;        res = res*10 + tmp;        if (res2 != 0 && res/res2 <10) {            return sign==1?INT_MIN:INT_MAX ;         }        }    return sign==1?res*-1:res;}​
0 0