最短排序

题目描述

对于一个无序数组A,请设计一个算法,求出需要排序的最短子数组的长度。

给定一个整数数组A及它的大小n,请返回最短子数组的长度。

测试样例:

[1,5,3,4,2,6,7],7
返回:4
class ShortSubsequence {
public:
    int findShortest(vector<int> A, int n) {
        // write code here
        int left = -1, right = -1;
        int vmin = INT_MAX;
        int vmax = INT_MIN;
        for(int i = 0;i<A.size();i++)
        {
            if(vmax<=A[i])
                vmax = A[i];
            else
                right = i;
        }
        if(right == -1)
            return 0;
        for(int i = A.size()-1;i>-1;i--)
        {
            if(vmin>=A[i])
                vmin =A[i];
            else
                left = i;
        }
        if(left == -1)
            return 0;
        return right-left+1;
    }
};

 

### 关于路径排序图 在图论中,路径问题旨在找到两个节点间具有小总权重的路径。这类问题广泛应用于诸如网络路由、城市交通规划等领域[^1]。 #### Dijkstra算法简介 Dijkstra算法用于计算单源路径,即给定起点后求解该点至其余各点间的距离。此方法适用于所有边权非负的情形,在每次迭代过程中选取当前未处理结点集合里距初始位置近者作为新的考察对象,并更新其邻接顶点的距离估计值直至遍历完毕整个图表结构[^2]。 ```cpp #include <limits.h> #include <stdio.h> #define V 9 // 找到不在已访问列表内的小距离节点 int minDistance(int dist[], bool sptSet[]) { int min = INT_MAX, min_index; for (int v = 0; v < V; v++) if (sptSet[v] == false && dist[v] <= min) min = dist[v], min_index = v; return min_index; } void printSolution(int dist[], int n) { printf("Vertex Distance from Source\n"); for (int i = 0; i < V; i++) printf("%d \t\t %d\n", i, dist[i]); } void dijkstra(int graph[V][V], int src) { int dist[V]; // 存储终结果数组 bool sptSet[V]; for (int i = 0; i < V; i++) dist[i] = INT_MAX, sptSet[i] = false; dist[src] = 0; for (int count = 0; count < V - 1; count++) { int u = minDistance(dist, sptSet); sptSet[u] = true; for (int v = 0; v < V; v++) if (!sptSet[v] && graph[u][v] && dist[u] != INT_MAX && dist[u] + graph[u][v] < dist[v]) dist[v] = dist[u] + graph[u][v]; } printSolution(dist, V); } ``` 上述代码实现了基本形式下的迪杰斯特拉算法,能够有效地解决加权无向连通图上的单源路问题。 #### 拓扑排序及其应用场景 当面对的是有向无环图(Directed Acyclic Graph, DAG),可以采用拓扑排序来解决问题。这种方法不仅可用于确定线性次序,还能够在某些情况下帮助发现潜在循环依赖关系。例如,在分析社交平台内用户的相互推荐模式时,便可以通过构建相应的有向图并执行拓扑排序操作来进行环检测[^3]。 #### Floyd-Warshall全对路径算法概述 除了针对单一源头的情况外,有时也需要考虑任意两节点之间的路径查询需求。此时可选用Floyd-Warshall算法完成多源路径搜索任务。它基于动态规划思想,通过对中间节点逐步扩展的方式实现全局优解的获取[^4]。 ```python def floyd_warshall(graph): # 初始化dist矩阵等于graph dist = list(map(lambda p: list(map(lambda q: q, p)), graph)) # 添加额外一维表示经由哪个点到达目标点 for r in range(len(graph)): for p in range(len(graph)): for q in range(len(graph)): dist[p][q] = min(dist[p][q], dist[p][r] + dist[r][q]) return dist ``` 以上Python函数展示了如何运用弗洛伊德-沃舍尔算法高效地计算出每一对顶点间的路径长度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值