六月一日,数组

概念:

1.数组是顺序的,连续的,依次的,线性的,存放在存储单元中

2.在c语言中,数组从0开始

3.在C语言中,应合理规划数组的长度,规避数组超过最大容量的问题

 

#define MAXN 1024
#define DataType int        // (1)

struct SeqList {
    DataType data[MAXN];    // (2)
    int length;             // (3)
};
代码1.1 数组的数据结构

 

数组的常用“属性”

DataType SeqListIndex(struct SeqList *sq, int i) {
    return sq->data[i];          // (1)
}
代码1.2 数组的索引

 

DataType SeqListFind(struct SeqList *sq, DataType dt) {
    int i;
    for(i = 0; i < sq->length; ++i) { // (1)
        if(sq->data[i] == dt) {
            return i;                 // (2)
        }    
    }
    return -1;                        // (3)
}
代码1.3 数组的查找

 

DataType SeqListGetLength(struct SeqList *sq) {
    return sq->length;
}
代码1.4获取长度

 

int SeqListInsert(struct SeqList *sq, int k, DataType v) {
    int i;
    if(sq->length == MAXN) {
        return 0;                        // (1)
    }
    for(i = sq->length; i > k; --i) {
        sq->data[i] = sq->data[i-1];     // (2)
    }
    sq->data[k] = v;                     // (3)
    sq->length ++;                       // (4)
    return 1;                            // (5)
}
代码1.5 插入

int SeqListDelete(struct SeqList *sq, int k) {
    int i;
    if(sq->length == 0) {
        return 0;                        // (1)
    }
    for(i = k; i < sq->length - 1; ++i) {
        sq->data[i] = sq->data[i+1];     // (2)
    }
    sq->length --;                       // (3)
    return 1;                            // (4)  
}
代码1.6 删除

 

在数据结构课上,上述代码为教学重点,,,

讲了好几堂课,,,

 

数组的相关算法

 

int findMin(int* nums, int numsSize){
    int i, min = 100000;
    for(i = 0; i < numsSize; ++i) {     // (1)
        if(nums[i] < min) {             // (2)
            min = nums[i];
        }
    }
    return min;                         // (3)
}

代码2.1线性枚举

,,,,,,

 

int sum[maxn];
int* prefixSum(int* nums, int numsSize, int m, int *l, int *r){
    int i;
    int *ret;
    for(i = 0; i < numsSize; ++i) {
        sum[i] = nums[i];
        if(i)
            sum[i] += sum[i-1];                 // (1)
    }
    ret = (int *) malloc( m * sizeof(int) );    // (2)
    for(i = 0; i < m; ++i) {
        int leftsum = l[i]==0? 0 : sum[l[i]-1]; // (3)
        int rightsum = sum[r[i]];
        ret[i] = rightsum - leftsum;            // (4)
    }
    return ret;
}

代码2.2 前缀和差分

,,,,,,

int getmaxlen(int n, char *str, int& l, int& r) {
    int ans = 0, i = 0, j = -1, len;   // 1)
    memset(h, 0, sizeof(h));           // 2)
    while (j++ < n - 1) {              // 3)
        ++h[ str[j] ];                 // 4)
        while (h[ str[j] ] > 1) {      // 5)
            --h[ str[i] ];
            ++i;
        }
        len = j - i + 1;              
        if(len > ans)                  // 6)
            ans = len, l = i, r = j;
    }
    return ans;
}

代码2.3 双指针

,,,,,,

int search(int *nums, int numsSize, int target) {
    int l = 0, r = numsSize - 1;         // (1)
    while(l <= r) {                      // (2)
        int mid = (l + r) >> 1;          // (3)
        if(nums[mid] == target) {   
            return mid;                  // (4)
        }else if(target > nums[mid]) {
            l = mid + 1;                 // (5)
        }else if(target < nums[mid]) {
            r = mid - 1;                 // (6)
        }
    }
    return -1;                           // (7)
}

代码2.4 二分枚举

代码2.5 三分枚举

,,,,,,

#include <stdio.h>

int a[1010];

void Input(int n, int *a) {
    for(int i = 0; i < n; ++i) {
        scanf("%d", &a[i]);
    }
}

void Output(int n, int *a) {
    for(int i = 0; i < n; ++i) {
        if(i)
            printf(" ");
        printf("%d", a[i]);
    }
    puts("");
}

void InsertSort(int n, int *a) {       // (1)
    int i, j;
    for(i = 1; i < n; ++i) {
        int x = a[i];                  // (2)
        for(j = i-1; j >= 0; --j) {    // (3)
            if(x <= a[j]) {            // (4)
                a[j+1] = a[j];         // (5)
            }else
                break;                 // (6)
        }
        a[j+1] = x;                    // (7)
    }
}

int main() {
    int n;
    while(scanf("%d", &n) != EOF) {
        Input(n, a);
        InsertSort(n, a);
        Output(n, a);
    }
    return 0;
}

代码2.6 插入排序

,,,,,,


#include <stdio.h>

int a[1010];

void Input(int n, int *a) {
    for(int i = 0; i < n; ++i) {
        scanf("%d", &a[i]);
    }
}

void Output(int n, int *a) {
    for(int i = 0; i < n; ++i) {
        if(i)
            printf(" ");
        printf("%d", a[i]);
    }
    puts("");
}

void Swap(int *a, int *b) {
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

void SelectionSort(int n, int *a) {  // (1)
    int i, j;
    for(i = 0; i < n - 1; ++i) {     // (2)
        int min = i;                 // (3)
        for(j = i+1; j < n; ++j) {   // (4)
            if(a[j] < a[min]) {
                min = j;             // (5)
            }
        }
        Swap(&a[i], &a[min]);        // (6)
    }
}

int main() {
    int n;
    while(scanf("%d", &n) != EOF) {
        Input(n, a);
        SelectionSort(n, a);
        Output(n, a);
    }
    return 0;
}
代码2.7 选择排序

,,,,,,

#include <stdio.h>

int a[1010];

void Input(int n, int *a) {
    for(int i = 0; i < n; ++i) {
        scanf("%d", &a[i]);
    }
}

void Output(int n, int *a) {
    for(int i = 0; i < n; ++i) {
        if(i)
            printf(" ");
        printf("%d", a[i]);
    }
    puts("");
}

void Swap(int *a, int *b) {
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

void BubbleSort(int n, int *a) {             // (1)
    bool swapped;
    int last = n;
    do {
        swapped = false;                     // (2)
        for(int i = 0; i < last - 1; ++i) {  // (3)
            if(a[i] > a[i+1]) {              // (4)
                Swap(&a[i], &a[i+1]);        // (5)
                swapped = true;              // (6)
            }
        }
        --last;
    }while (swapped);
}

int main() {
    int n;
    while(scanf("%d", &n) != EOF) {
        Input(n, a);
        BubbleSort(n, a);
        Output(n, a);
    }
    return 0;
}

代码2.8 冒泡排序

,,,,,,

练习题

1.所有奇数长度子数组的和 leetcode1588

class Solution:
    def sumOddLengthSubarrays(selfarr: List[int]) -> int:
        
        
       
        ret = 0
        for i in range(len(arr)):
            sum = 0
            for j in range(i,len(arr)):
                sum += arr[j]
                if((j-i+1) & 1):
                    ret += sum
                
            
        return ret
2.到目标元素的最小距离 leetcode1848
class Solution:
    def getMinDistance(selfnums: List[int], targetintstartint) -> int:
        u = -1

        Min = 65533
        for i in range(len(nums)):
            if(nums[i] == target and abs(i-start)<Min):
                Min = abs(i-start)
                u = i

        return Min
posted @ 2022-06-01 23:12  siwen12  阅读(30)  评论(0编辑  收藏  举报