數據結構第一節(初步認識)——三個小題

三個小題

01-複雜度1 最大子列和問題 (20point(s))

給定K個整數組成的序列{ N1​​ , N​2, ..., NK​​ },「連續子列」被定義爲{ N​i , N​i+1 , ..., Nj },其中 1≤i≤j≤K。「最大子列和」則被定義爲全部連續子列元素的和中最大者。例如給定序列{ -2, 11, -4, 13, -5, -2 },其連續子列{ 11, -4, 13 }有最大的和20。現要求你編寫程序,計算給定整數序列的最大子列和。算法

本題旨在測試各類不一樣的算法在各類數據狀況下的表現。各組測試數據特色以下:數組

  • 數據1:與樣例等價,測試基本正確性;
  • 數據2:102個隨機整數;
  • 數據3:103個隨機整數;
  • 數據4:104個隨機整數;
  • 數據5:105個隨機整數;

輸入格式:
輸入第1行給出正整數K (≤100000);第2行給出K個整數,其間以空格分隔。函數

輸出格式:
在一行中輸出最大子列和。若是序列中全部整數皆爲負數,則輸出0。測試

輸入樣例:this

6
-2 11 -4 13 -5 -2spa

輸出樣例:code

20接口

解決思路:動態分析,設置兩個變量,一個記錄歷史最大子列和,另外一個記錄當前子列和。若是當前子列和大於歷史子列和就替換掉它。若是當前子列和小於0,則將其歸零從新計數。ci

代碼:element

#include<stdio.h>

int main(void) {
	int number = 0;
	scanf("%d", &number);
	int array[number];
	int temp;
	//讀入數組
	for (int i = 0; i < number; i++) {
		scanf("%d", &temp);
		array[i] = temp;
	}
	int maxvalue = -1;
	int thisvalue = 0;
	for (int i = 0; i < number; i++) {
		thisvalue += array[i];
		//當前子列和大於歷史子列和的替換掉它
		if (thisvalue > maxvalue) {
			maxvalue = thisvalue;
		}
		//當前子列和小於零則從新計數。
		else if (thisvalue < 0) {
			thisvalue = 0;
		}
	}
	printf("%d", maxvalue);
	return 0;
}

01-複雜度2 Maximum Subsequence Sum (25point(s))

Given a sequence of K integers{ N1​​ , N​2, ..., NK​​ }. A continuous subsequence is defined to be { N​i , N​i+1 , ..., Nj } where 1≤i≤j≤K. The Maximum Subsequence is the continuous subsequence which has the largest sum of its elements. For example, given sequence { -2, 11, -4, 13, -5, -2 }, its maximum subsequence is { 11, -4, 13 } with the largest sum being 20.

Now you are supposed to find the largest sum, together with the first and the last numbers of the maximum subsequence.

Input Specification:
Each input file contains one test case. Each case occupies two lines. The first line contains a positive integer K (≤10000). The second line contains K numbers, separated by a space.

Output Specification:
For each test case, output in one line the largest sum, together with the first and the last numbers of the maximum subsequence. The numbers must be separated by one space, but there must be no extra space at the end of a line. In case that the maximum subsequence is not unique, output the one with the smallest indices i and j (as shown by the sample case). If all the K numbers are negative, then its maximum sum is defined to be 0, and you are supposed to output the first and the last numbers of the whole sequence.

Sample Input:

10
-10 1 2 3 4 -5 -23 3 7 -21

Sample Output:

10 1 4

解決思路:本題相比上一題,加了新的要求。其一是全部數字都爲負數時,輸出子列和爲0,和該數列的開始和末尾。另外就是統計最大子列和開始和結束的數字。對於第一個,能夠默認整個數列爲所有負數,在遍歷的同時檢查是否有大於等於0的數字,若是有說明不是。對於對大子列和的開始和結束,結束位置由於有當前子列和大於歷史子列和就替換掉它的操做,只要在替換時同時把結束位置定在當前遍歷到的位置便可,開始位置初始設爲0,並且還須要有一個向後走的記錄多是最大的大子列開始。等到當前大子列大於歷史是,把當前大子列保存。

代碼:

#include<stdio.h>
#include<stdio.h>
int main(void) {
	int number;
	int array[100000];
	scanf("%d", &number);
	int temp;
	//讀入數組
	for (int i = 0; i < number; i++) {
		scanf("%d", &temp);
		array[i] = temp;
	}
	int maxvalue = -1;
	int thisvalue = 0;
	int oldbegin = 0;
	int newbegin = 0;
	int end = 0;
	int isallKNag = 1;
	for (int i = 0; i < number; i++) {
		//判斷是否有大於0的數組
		if (array[i]>=0) {
			isallKNag = 0;
		}
		thisvalue += array[i];
		//若是當前子列和大於歷史的,替換而且將結束下標定位到當前遍歷到的下標,且保存當前最大子列和開始位置
		if (thisvalue > maxvalue) {
			maxvalue = thisvalue;
			end = i;
			oldbegin = newbegin;	
		}
		//若是當前最大子列和小於0,將其歸零,並當前最大子列和開始位置設在下一位
		else if (thisvalue < 0) {
			thisvalue = 0;
			newbegin = i + 1;
		}
	}
	if (isallKNag == 0) {
		printf("%d %d %d", maxvalue,array[oldbegin],array[end]);
	}
	else {
		printf("%d %d %d", 0, array[0], array[number-1]);
	}
	return 0;
}

01-複雜度3 二分查找 (20point(s))

題要求實現二分查找算法。

函數接口定義:

Position BinarySearch( List L, ElementType X );

其中List結構定義以下:

typedef int Position;
typedef struct LNode *List;
struct LNode {
    ElementType Data[MAXSIZE];
    Position Last; /* 保存線性表中最後一個元素的位置 */
};

L是用戶傳入的一個線性表,其中ElementType元素能夠經過>、==、<進行比較,而且題目保證傳入的數據是遞增有序的。函數BinarySearch要查找X在Data中的位置,即數組下標(注意:元素從下標1開始存儲)。找到則返回下標,不然返回一個特殊的失敗標記NotFound。

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 10
#define NotFound 0
typedef int ElementType;

typedef int Position;
typedef struct LNode *List;
struct LNode {
    ElementType Data[MAXSIZE];
    Position Last; /* 保存線性表中最後一個元素的位置 */
};

List ReadInput(); /* 裁判實現,細節不表。元素從下標1開始存儲 */
Position BinarySearch( List L, ElementType X );

int main()
{
    List L;
    ElementType X;
    Position P;

    L = ReadInput();
    scanf("%d", &X);
    P = BinarySearch( L, X );
    printf("%d\n", P);

    return 0;
}

/* 你的代碼將被嵌在這裏 */

輸入樣例1:

5
12 31 55 89 101
31

輸出樣例1:

2

輸入樣例2:

3
26 78 233
31

輸出樣例2:

0

解決方法:設置三個變量高中低,初始低爲1,高爲線性表最後一位的位置,中爲高和低的中間,這是一個循環,循環的條件是(低<=高),若是線性表下標爲中等於要查找的元素,返回中,若是該值大於查找值,說明查找值可能在中和低之間,令高爲(中-1),同理........

代碼:

//這裏給出的是全代碼,包括讀入
#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 10
#define NotFound 0
typedef int ElementType;

typedef int Position;
typedef struct LNode* List;
struct LNode {
    ElementType Data[MAXSIZE];
    Position Last; /* 保存線性表中最後一個元素的位置 */
};

List ReadInput(); /* 裁判實現,細節不表。元素從下標1開始存儲 */
Position BinarySearch(List L, ElementType X);

int main()
{
    List L;
    ElementType X;
    Position P;

    L = ReadInput();
    scanf("%d", &X);
    P = BinarySearch(L, X);
    printf("%d\n", P);
    return 0;
}

/* 你的代碼將被嵌在這裏 */
List ReadInput() {
	//申請一塊空間儲存l,初始的最後一位是0
    List L = (List)malloc(sizeof(struct LNode));
    L->Last = 0;
    //要讀多少個數?
    int num;
    scanf("%d", &num);
    //逐個讀入,讀入的同時增大最後一位的位置。
    for (int i = 0; i < num; i++) {
        scanf("%d", &L->Data[L->Last++]);
    }
    return L;
}

Position BinarySearch(List L, ElementType X) {
    int begin = 1, end = L->Last;
    
    while (begin <= end) {
        int mid = (begin + end) / 2;
        if (L->Data[mid]==X) {
            return (mid);
        }
        else if (L->Data[mid] > X) {
            end = mid - 1;
        }
        else {
            begin = mid + 1;
        }
    }
    return NotFound;
}
相關文章
相關標籤/搜索