zoukankan      html  css  js  c++  java
  • 数组

    合并两个数组

    给定含有n个元素的两个有序(非降序)整型数组a和b。合并两个数组中的元素到整型数组c,要求去除重复元素并保持c有序(非降序)。例子如下

    a = 1, 2, 4, 8

    b = 1, 3, 5, 8

    c = 1, 2, 3, 4, 5, 8

    分析

    利用合并排序的思想,两个指针i,j和k分别指向数组a和b,然后比较两个指针对应元素的大小,有以下三种情况

    1. a[i] < b[j],则c[k] = a[i]。

    2. a[i] == b[j],则c[k]等于a[i]或b[j]皆可。

    3. a[i] > b[j],则c[k] = b[j]。

    重复以上过程,直到i或者j到达数组末尾,然后将剩下的元素直接copy到数组c中即可。

    // 合并两个有序数组

    void Merge(int *a, int *b, int *c, int n)
    {
        int i = 0 ;
        int j = 0 ;
        int k = 0 ;
    
        while (i < n && j < n)
        {
            if (a[i] < b[j])// 如果a的元素小,则插入a中元素到c
            {
                c[k++] = a[i] ;
                ++i ;
            }
            else if (a[i] == b[j])// 如果a和b元素相等,则插入二者皆可,这里插入a
            {
                c[k++] = a[i] ;
                ++i ;
                ++j ;
            }
            else // a[i] > b[j] // 如果b中元素小,则插入b中元素到c
            {
                c[k++] = b[j] ;
                ++j ;
            }
        }
    
        if (i == n) // 若a遍历完毕,处理b中剩下的元素
        {
            for (int m = j; m < n; ++m)
                c[k++] = b[m] ;
        }
        else//j == n, 若b遍历完毕,处理a中剩下的元素
        {
            for (int m = i; m < n; ++m)
                c[k++] = a[m] ;
        }
    }
    View Code

    组合问题

    给定一个含有n个元素的整型数组a,从中任取m个元素,求所有组合。比如下面的例子

    a = 1, 2, 3, 4, 5

    m = 3

    输出

    1 2 3, 1 2 4, 1 2 5, 1 3 4, 1 3 5, 1 4 5

    2 3 4, 2 3 5, 2 4 5
    3 4 5

    分析

    典型的排列组合问题,首选回溯法,为了简化问题,我们将a中n个元素值分别设置为1-n

    代码

    复制代码
    // n选m的所有组合
    int buffer[100] ;

    void PrintArray(int *a, int n)
    {
    for (int i = 0; i < n; ++i)
    cout << a[i] << "";
    cout << endl ;
    }

    bool IsValid(int lastIndex, int value)
    {
    for (int i = 0; i < lastIndex; i++)
    {
    if (buffer[i] >= value)
    return false;
    }
    return true;
    }

    void Select(int t, int n, int m)
    {
    if (t == m)
    PrintArray(buffer, m);
    else
    {
    for (int i = 1; i <= n; i++)
    {
    buffer[t] = i;
    if (IsValid(t, i))
    Select(t + 1, n, m);
    }
    }
    }
    复制代码
  • 相关阅读:
    查看 lib 库信息
    评委打分(C++ 容器综合练习)
    二阶段12.16
    对搜狗输入法的使用心得
    二阶段12.14
    二阶段12.13
    二阶段12.12
    典型用户描述
    水王(课堂练习)
    一阶段11.21
  • 原文地址:https://www.cnblogs.com/beipiaoboy/p/3254303.html
Copyright © 2011-2022 走看看