快排、归并、前缀和,差分、位运算
快排
public static void quick(int l, int r) {
if (l >= r) {
System.out.println(nums[m]);
return;
}
int i = l-1, j = r+1, mid = nums[l + r >> 1];
while (i < j) {
do i++;while (nums[i] < mid);
do j--;while (nums[j] > mid);
if (i < j) {
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
}
quick(l, j);
quick(j + 1, r);
}
归并
public static void digui(int l, int r) {
if(l>=r) return;
int mid=l+r>>1;
digui(l,mid);
digui(mid+1, r);
int i=l,j=mid+1,k=0;
while (i<=mid&&j<=r){
if(nums[i]<nums[j]) tmp[k++]=nums[i++];
if(nums[i]>=nums[j]) tmp[k++]=nums[j++];
}
while (i<=mid) tmp[k++]=nums[i++];
while (j<=r) tmp[k++]=nums[j++];
for(i=l,k=0;i<=r;i++){
nums[i]=tmp[k++];
}
}
前缀和
for (int i = 1; i <=n ; i++) {
a[i]=scan.nextInt();
pre[i]=a[i]+pre[i-1];
}
差分
public static void main(String[] args) {
n=sc.nextInt();
m=sc.nextInt();
nums=new int[n+10];
pre=new int[n+10];
for(int i=1;i<=n;i++) {
nums[i]=sc.nextInt();
insert(i,i,nums[i]);
}
while(m-->0) {
int l=sc.nextInt();
int r=sc.nextInt();
int c=sc.nextInt();
insert(l, r, c);
}
for(int i=1;i<=n;i++) {
pre[i]+=pre[i-1];
System.out.print(pre[i]+" ");
}
}
public static void insert(int x1,int x2,int c) {
pre[x1]+=c;
pre[x2+1]-=c;
}
位运算 lowbit(把数字二进制最后一个1取出来)
public static int lowbit(int x) {
return x&-x;
}