算法
Goldinger
这个作者很懒,什么都没留下…
展开
-
分治策略----寻找数组中第k小的元素
#include <stdio.h>/*先给出一个划分函数(快速排序的划分)*/int partition(int* ar, int left, int right){ int i = left; int j = right; int tmp = ar[i]; while (i < j) { while (i<j && ar[j] > tmp) { j--; } if (i < j) ar[i] = ar[j];原创 2022-04-09 10:18:16 · 357 阅读 · 0 评论 -
2021-07-29快速幂
快速幂:n&1:(1即01)二进制:均为1时为1.n为奇数时:1n为偶数时:0幂x=pow(a,n)n为偶数时:x=(aa)^(n/2)n为奇数时:x=a(a*a)^(n/2)最后n=1返回ans.#include<iostream>using namespace std;int power(int a, int n)//a^n{ int ans = 1; while (n > 0) { if (n & 1)原创 2021-07-30 14:03:12 · 56 阅读 · 0 评论 -
数组(二分查找快速排序)
#include<iostream>#include<vector>using namespace std;void ef(vector<int> &a,int l,int r,int k){ while(l<=r) { int mid=(l+r)/2; if(a[mid]==k){ cout<<mid+1; break;} else if(a[mid]>k)原创 2022-03-07 11:15:16 · 82 阅读 · 0 评论 -
归并排序(分治法)
#include<bits/stdc++.h>using namespace std; //归并过程void merge(int arr[], int l, int mid, int r){ int help[r-l+1];//辅助数组 int i = 0; int lIndex = l; int rIndex = mid+1; while(lIndex <= mid && rIndex <= r){ help[i++] = arr[lIndex原创 2022-03-05 21:03:56 · 119 阅读 · 0 评论 -
二分查找(I)
现在有一个长度为n的有序的序列,m次询问,每次会告诉你一个数字x,让你完成以下两种操作:1.找到第一个大于等于x的值的下标,如果有多个等于的话找到第一个等于的下标2.找到第一个大于x的值的下标如果没有就输出NO,保证序列有序。#include<stdio.h>int a[100001];int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf(".原创 2022-02-28 12:14:47 · 166 阅读 · 0 评论 -
删数求最小值
给定一个n位正整数a, 去掉其中k个数字后按原左右次序将组成一个新的正整数。对给定的a, k寻找一种方案,使得剩下的数字组成的新数最小。贪心算法:在整数的位数固定的前提下,让高位的数字尽量小,整数的值就小。这就是所要选取的贪心策略。当k=1时,对于n位数构成的数,删一位,删除满足如下条件的a[i]:它是第一个a[i]>a[i+1]的数,如果不存在则删除a[n]。当k>1(当然小于n),按上述操作一个一个删除。每删除一个数字后,后面的数字向前移位。删除一个达到最小后,再从头即从串首开始.原创 2022-02-25 21:36:36 · 676 阅读 · 0 评论