算法总结

常用算法总结

归并
void Merge(vector<int>& vec,int low,int high){
    if(low>=high) return;
    else{
        int mid=low+(high-low)/2;
        Merge(vec,low,mid);
        Merge(vec,mid+1,high);
        MergeSort(vec,low,mid,high);
    }
}
void MergeSort(vector<int>& vec,int low,int mid,int high){
    int start=low;
    int center=mid+1;
    int num=low;
    vector<int> temp(vec.size(),0);
    while(start<=mid&&center<=high){
        if(vec[start]<vec[center])
            temp[num++]=vec[start++];
        else
            temp[num++]=vec[center++];
    }
    while(start<=mid){
        temp[num++]=vec[start++];
    }
    while(center<=high){
        temp[num++]=vec[center++];
    }
    for(int i=low;i<=high;i++){
        vec[i]=temp[i];
    }
}
快排
void QuickSort(vector<int>& vec, int low, int high){
        if (low >= high) return;
        else{
            int key = vec[low];
            int i = low, j = high;
            while (i<j){
                while (i<j&&vec[j] >= key)
                    j--;
                if (i<j)
                vec[i++] = vec[j];
                while (i<j&&vec[i] <= key){
                    i++;
                }
                if (i<j)
                vec[j--] = vec[i];
            }
            vec[i] = key;
            QuickSort(vec, low, i - 1);
            QuickSort(vec, i + 1, high);
        }
}
冒泡排序
void swap(int& a,int& b){
    int temp;
    temp=a;
    a=b;
    b=temp;
}
void BubbleSort(vector<int>& vec){
    int len=vec.size();
    for(int i=0;i<len-1;i++)
       for(int j=len-1;j>i;j--){
            if(vec[j]<vec[j-1]){
                swap(vec[j],vec[j-1]);
            }
       }
}
//优化的冒泡排序
void BubbleSort(vector<int>& vec){
    int len=vec.size();
    int flag=0;
    for(int i=0;i<len-1;i++)
    {
       flag=0;
       for(int j=len-1;j>i;j--){
            if(vec[j]<vec[j-1]){
                flag=1;
                swap(vec[j],vec[j-1]);
            }
       }
       if(flag==0)
           break;
    }
}
二分查找
int Search(vector<int> vec,int key){
    int low=0,high=vec.size()-1,mid;
    while(low<=high){
        mid=low+(high-low)/2;
        if(vec[mid]==key)
            return mid;
        else if(vec[mid]<key){
            low=mid+1;
        }
        else
            high=mid-1;
    }
    return -1;
}
combination sum
Two Sum

两个数的和为目标数字,可通过遍历一遍数组,通过mp值存入数字,每次在mp中查找mp[target-num[i]],有的话就打印,没有的话,将当前数字num[i]放到mp中。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int size=nums.size();
        map<int,int>mp;
        vector<int> nums1;
        vector<int> res;
        for(int i=0;i<size;i++)
        {
            int findnum=target-nums[i];
            if(mp[findnum]){
                res.push_back(mp[findnum]-1);
                res.push_back(i);
                break;
            }
            else{
                mp[nums[i]]=i+1;
            }
        }
        return res;
    }
};
Combination Sum

从一个数组中选择不确定的几个数字,和为target。
原数组中没有重复的数字,但原数组中的数字可以重复使用。
没有重复的数字不需要考虑组合重复的情况。

vector<vector<int>> sumArray(vector<int> vec,vector<int> array,int index,int target,int sum,vector<vector<int>> res){
    if(sum==target)
        res.push_back(vec);
    else{
        for(int i=index;i<array.size();i++){
            if(sum+array[i]>target)
                continue;
            else{
                vec.push_back(array[i]);
                sumArray(vec,array,i,target,sum+array[i],res);
                vec.pop_back();
            }
        }
    }
    return res;
}
Combination Sum II

从一个数组中选择不确定的几个数字,和为target。
原数组中有重复的数字,原数组中的数字不可以重复使用。
先进行排序:sort(candidates.begin(),candidates.end());
然后如果当前的i不等于index说明不是遍历到当前数字时选择,然后又等于前一个数字的话,continue;
if(i!=index&&array[i]==array[i-1]) continue。

class Solution {
public:
    void sumArray(vector<int> array,vector<int> vec,vector<vector<int>>& res,int index,int sum,int target){
        if(sum==target)
            res.push_back(vec);
        else{
            for(int i=index;i<array.size();i++){
                if(sum+array[i]>target) continue;
                else{
                    if(i!=index&&array[i]==array[i-1]) continue;
                    vec.push_back(array[i]);  
                    sumArray(array,vec,res,i+1,sum+array[i],target);
                    vec.pop_back();
                }
            }

        }
    }
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        vector<int> vec;
        vector<vector<int>> res;
        sort(candidates.begin(),candidates.end());
        sumArray(candidates,vec,res,0,0,target);
        return res;
    }
};
Combination Sum III

指定K个数字(1~9),使其和为n。

class Solution {
public:
    void sumArray(vector<int> vec,int index,int sum,int target,int count,int k,vector<vector<int>>& res){
        if(sum==target){
            if(count==k) res.push_back(vec);
        }
        else{
            for(int i=index;i<10;i++){
                if(sum+i>target) continue;
                else{
                    vec.push_back(i);
                    sumArray(vec,i+1,sum+i,target,count+1,k,res);
                    vec.pop_back();
                }
            }
        }
    }
    vector<vector<int>> combinationSum3(int k, int n) {
        vector<vector<int>> res;
        vector<int> vec;
        sumArray(vec,1,0,n,0,k,res);
        return res;
    }
};
全排列
class Solution{
public:
    void rankArray(vector<int> vec,vector<vector<int>> res,int len,int index){
        if(index==len){
            res.push_back(vec);
        }
        else{
            for(int i=index;i<len;i++){
                swap(vec[index],vec[i]);
                rankArray(vec,res,len,index+1);
                swap(vec[index],vec[i]);
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值