1. 程式人生 > >程式設計基礎57 隨機選擇演算法,找出陣列第n/2大,並返回後一半減去前一半的值,複雜度o(n)

程式設計基礎57 隨機選擇演算法,找出陣列第n/2大,並返回後一半減去前一半的值,複雜度o(n)

#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<algorithm>
using namespace std;
const int max_n = 100010;
int A[max_n], n;
int randPartition(int A[], int left, int right) {
	int p = round(1.0*rand() / RAND_MAX*(right - left)) + left;
	swap(A[p], A[left]);
	int temp = A[left];
	while(left<right){
		while (left < right&&A[right] > temp)right--;
		A[left] = A[right];
		while (left < right&&A[left] <= temp)left++;
		A[right] = A[left];
	}
	A[left] = temp;
	return left;
}
void randSelect(int A[], int left, int right, int K) {
	if (left == right)return;
	int p = randPartition(A, left, right);
	int M = p - left + 1;
	if (K == M)return;
	if (K < M) {
		randSelect(A, left, p - 1, K);
	}
	else {
		randSelect(A, p + 1, right, K - M);
	}
}
int main() {
	srand((unsigned)time(NULL));
	int sum = 0, sum1 = 0;
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf("%d", &A[i]);
		sum += A[i];
	}
	randSelect(A, 0, n - 1, n / 2);
	for (int i = 0; i < n / 2; i++) {
		sum1 += A[i];
	}
	printf("%d\n", (sum - sum1) - sum1);
	return 0;
}

相關推薦

程式設計基礎57 隨機選擇演算法陣列n/2返回一半減去一半複雜o(n)

#include<cstdio> #include<cstdlib> #include<ctime> #include<algorithm> using namespace std; const int max_n = 1000

演算法:給定一個整數陣列和一個目標值陣列中和為目標值的兩個數、判斷一個整數是否是迴文數

<!-- 給定一個整數陣列和一個目標值,找出陣列中和為目標值的兩個數。 你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。 示例: 給定 nums = [2, 7, 11, 15], target = 9 因為 nums[0] + nums[1] = 2 + 7 = 9

前端演算法:給定一個整數陣列和一個目標值陣列中和為目標值的兩個數、判斷一個整數是否是迴文數

<!-- 給定一個整數陣列和一個目標值,找出陣列中和為目標值的兩個數。 你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。 示例: 給定 nums = [2, 7, 11, 15], target = 9 因為 nums[0] + nums[

演算法1:給定一個整數陣列和一個目標值陣列中和為目標值的兩個數的index

三種解決方法: 1、暴力法:遍歷每個num,查詢目標元素target-num class Solution: def twoSum(self, nums, target): """ :type nums: List[

(python)給定一個整數陣列和一個目標值陣列中和為目標值的兩個數--演算法

1、使用最容易理解的遍歷陣列進行查詢 def solution(nums,target): #如果列表長度小於2,則直接結束 if len(nums) < 2: return #兩次迴圈列表,分別對列表中的所有可

演算法:給定一個整數陣列和一個目標值陣列中和為目標值的兩個數

給定一個整數陣列和一個目標值,找出陣列中和為目標值的兩個數。 你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。 示例: 給定 nums = [2, 7, 11, 15], tar

【簡單演算法】1.兩數之和給定整數陣列和目標值陣列2數之和等於目標值的元素

接觸了程式碼,那麼演算法始終是繞不開的一個重點。 演算法對於開發人員,在日常之中的作用很大,但是對於測試人員來說,實際編碼中用到的似乎不是很多。 不過,現在大廠的測試開發的面試,演算法是必考的,而且這也的確是你的程式碼功底的一項重要體現,學學沒壞處。 ![](https://img2020.cnblogs

今日頭條下一個比它的整數

ring rgs pub int eof tostring 排序 sys .so package Integer;import java.util.Arrays;public class GetNextAsc { public static int getNextAs

尋找主元素演算法(時間複雜O(N)C#)

主元素問題:大小為N的陣列A,其主要元素是一個出現次數超過N/2的元素。 最近在學習演算法,書上發現這樣一道題,並且提供了一種遞迴演算法的概要,但是感覺不是特別好(遞迴判斷(時間複雜度大於O(N)了),還要對N的奇偶做出判斷以及使用附加陣列B),網上看了一下有一個SEO排行最靠前的(不說名字了,

用 prompt 輸入字串建立陣列陣列中最問題闡述與解決。

用 prompt 輸入字串建立陣列。用三種方法找出陣列中最大值。問題闡述與解決。 實現目標:輸入一組數,並找出這組數中最大的值。 採用的方法: 雙 for迴圈,列出從小到大(從大到小)順序。 單 for 迴圈,一遍迴圈找出最大值。 使用 Math.max。

Problem B: 零起點學演算法81——陣列中最元素的位置(下標值

#include<stdio.h> int main(void) { int n,a[10],i,max; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) scanf("%d",

把兩個有序數組合併成一個有序陣列演算法複雜O(N)

/** * */ /** * @author jueying: * @version 建立時間:2018-10-22 下午01:32:44 * 類說明 */ /** * @author jueying * */ public class Test4 {

給定一個整數陣列和一個目標值陣列中和為目標值的兩個數。

給定一個整數陣列和一個目標值,找出陣列中和為目標值的兩個數。 你可以假設每 示例: 給定 nums = [2, 7, 11, 15], target = 9 因為 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 個輸入只對應一種答

給定一個整數陣列和一個目標值陣列中和為目標值的兩個數

給定一個整數陣列和一個目標值,找出陣列中和為目標值的兩個數。 你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。 示例: 給定 nums = [2, 7, 11, 15], target = 9 因為 nums[0] + nums[1] =

一個時間複雜O(n)空間複雜O(1)的排序演算法

其實就是利用Hash的思想,開闢一個固定長度的hash陣列用於標記待排序陣列的資料元素是否出現過。由於固定長度的hash陣列,所以空間複雜度與待排序陣列資料規模n沒有關係,也就是說空間複雜度為O(1)。

計數排序傳說中時間複雜O(n+k)的排序演算法

基本思想 假設數序列中小於元素a的個數為n,則直接把a放到第n+1個位置上。當存在幾個相同的元素時要做適當的調整,因為不能把所有的元素放到同一個位置上。計數排序假設輸入的元素都是0到k之間的整數。 回到頂部 參考程式碼 #include &

LeetCode:給定一個整數陣列和一個目標值陣列中和為目標值的兩個數

給定一個整數陣列和一個目標值,找出陣列中和為目標值的兩個數。 示例: 給定 nums = [2, 7, 11, 15], target = 9 因為 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 思路:先在陣列中找出比target

給定一個數組陣列缺少的最小的正整數

題目使這樣的:請設計一個高效演算法,查詢陣列中未出現的最小正整數。 給定一個整數陣列A,請返回陣列中未出現的最小正整數。 測試樣例: [-1,2,3,4] 返回1 一看到這個題目我想到的是用另外的一個數組B,長度為A的長度+1,來儲存遍歷陣列A的數的值。 if(A[i]

輸入一串字元最長和最短單詞輸出

在上篇的基礎上,稍新增幾個變數則可輸出最長和最短; #include <stdio.h> #include <string.h> #include <stdlib.h> int main() { char arr[1024] =