算法设计与分析:01 Matrix(Week 14)

学号:16340008

题目:542. 01 Matrix


Question:

Given a matrix consists of 0 and 1, find the distance of the nearest 0 for each cell.

The distance between two adjacent cells is 1.

Example 1:
Input:

0 0 0
0 1 0
0 0 0

Output:

0 0 0
0 1 0
0 0 0

 

Example 2:
Input:

0 0 0
0 1 0
1 1 1

Output:

0 0 0
0 1 0
1 2 1

 

Note:

  1. The number of elements of the given matrix will not exceed 10,000.
  2. There are at least one 0 in the given matrix.
  3. The cells are adjacent in only four directions: up, down, left and right.

Answer:

对于该题,我们可以知道越在1区块内部的元素,距离0越远,相应数字也越大。同时,相邻两个元素的大小差距不会大于1。因此我们可以从0区块开始,往非0区块收敛,逐层往非0区块中心按数字顺序填充。我们需要先将所有的1替换成另外一种标识,以区分已填充与未填充。实际上使用一个新的矩阵进行填充是更好的。我们可以将未填充的部分标记为无穷大。

于是我们先初始化一个等宽高的矩阵,其所有元素均为无穷大:

row = len(matrix)
col = len(matrix[0])
newMatrix = [[float('inf') for i in range(col)] for i in range(row)]

然后进行宽度优先搜索(因为是一层层往非0区内部搜索)。宽度优先搜索我们可以使用队列,对队列头进行搜索,搜索结果加入队列尾。对于宽度优先搜索的第一层,应是所有0元素的坐标,因为我们是从0开始往非0区深入的。于是我们可以遍历原矩阵,将0元素的坐标推进队列,同时将将要返回的数组对应0区赋值为0

queue = collections.deque()
        
for i in range(row):
    for j in range(col):
        if matrix[i][j] == 0:
            newMatrix[i][j] = 0
            queue.append((i,j))

然后我们只需要循环推出队头,搜索推出的节点周围有没有应当比自己大的元素,有则赋值为该节点的+1,并推进队尾。

while queue:
    (r, c) = queue.popleft()
    for (move0, move1) in [(1,0), (-1, 0), (0, 1), (0, -1)]:
        newR, newC = r + move0, c + move1
        if 0 <= newR < row and 0 <= newC < col and newMatrix[r][c] + 1 < newMatrix[newR][newC]:
            newMatrix[newR][newC] = newMatrix[r][c] + 1
            queue.append((newR, newC))

最后返回新矩阵即可。 

以下为完整代码(喊本地测试代码):

import collections
class Solution:
    def updateMatrix(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: List[List[int]]
        """
        row = len(matrix)
        col = len(matrix[0])
        newMatrix = [[float('inf') for i in range(col)] for i in range(row)]

        queue = collections.deque()
        
        for i in range(row):
            for j in range(col):
                if matrix[i][j] == 0:
                    newMatrix[i][j] = 0
                    queue.append((i,j))
        
        while queue:
            (r, c) = queue.popleft()
            for (move0, move1) in [(1,0), (-1, 0), (0, 1), (0, -1)]:
                newR, newC = r + move0, c + move1
                if 0 <= newR < row and 0 <= newC < col and newMatrix[r][c] + 1 < newMatrix[newR][newC]:
                    newMatrix[newR][newC] = newMatrix[r][c] + 1
                    queue.append((newR, newC))

        return newMatrix

matrix = [[1, 0, 1, 1, 0, 0, 1, 0, 0, 1], [0, 1, 1, 0, 1, 0, 1, 0, 1, 1], [0, 0, 1, 0, 1, 0, 0, 1, 0, 0], [1, 0, 1, 0, 1, 1, 1, 1, 1, 1], [0, 1, 0, 1, 1, 0, 0, 0, 0, 1], [0, 0, 1, 0, 1, 1, 1, 0, 1, 0], [0, 1, 0, 1, 0, 1, 0, 0, 1, 1], [1, 0, 0, 0, 1, 1, 1, 1, 0, 1], [1, 1, 1, 1, 1, 1, 1, 0, 1, 0], [1, 1, 1, 1, 0, 1, 0, 0, 1, 1]]
test = Solution()
print(test.updateMatrix(matrix))

Leetcode提交结果: 

算法本质是宽度优先搜索,算法时间复杂度为O(n),n为矩阵总元素数(即长×宽)。 

``` {—————————————— 智能选股系统 V6.0 OPTIMIZED ——————————————} // 动态参数优化器(遗传算法优化) PARAM_OPTIMIZE := GENETIC_OPT(EPOCH=1000, POP_SIZE=200); {——动态估值引擎(自适应贝叶斯-ML融合)——} EPS_TTM := MAX(FINANCE(33), 0.000001)/MAX(FINANCE(1), 0.000001); IND_PE := CLOSE/EPS_TTM; WT_ALPHA := ML_PREDICT(FEATURES=[VOL_RATIO,PE_HIST,INDEX_TREND], MODEL='XGBoost', LOOKBACK=500) * 0.85 + 0.15*RANK(CORR(CLOSE,IND_PE,20)); DYNPETTM_N := CLOSE/(WT_ALPHA*IND_PE + (1-WT_ALPHA)*WMA(IND_PE,90)); PEG_VAL := DYNPETTM_N/MAX(EMA(FINANCE(54)/FINANCE(34),5)*100, 0.01); {——情绪引擎PRO(LSTM时序预测)——} NORTH_FLOW := LSTM_PREDICT(SEQ_LEN=30, FEATURES=[HKHOLD,DEEP_VOL], HIDDEN_UNITS=64); ORDERFLOW_RT := (DYNAINFO(58)-DYNAINFO(57))/MAX(DYNAINFO(56),1); MF_RATIO := SUM(IF(CLOSE>DYNAINFO(11),VOL*1.8,-VOL*0.6),5)/MA(VOL,5)*1.5 + 0.45*EMA(DYNAINFO(58)/DYNAINFO(57),21); HOT_INDEX := (MF_RATIO*0.7 + NORTH_FLOW*0.3) * POW(1.25, BLOCKVOLRATE); {——智能波动率(GARCH-M模型)——} VOL_BAND := GARCH_VOL(CLOSE, P=2, Q=2, LOOKBACK=120); ADAPTIVE_VOL := (STD(CLOSE,30)/MA(CLOSE,30))*0.6 + VOL_BAND*0.4; MARKET_STATE := KMEANS_CLUSTER(FEATURES=[INDEXC_RETURN,VOL_SPIKE], N_CLUSTERS=3); {——行业轮动增强(政策NLP分析)——} NEWS_SENTIMENT := NLP_ANALYSIS(SOURCE='NEWS', KEYWORDS=['补贴','规划','指导意见'], SENTIMENT_WINDOW=5); INDUSTRY_MOM := EMA(CLOSE,5)/EMA(CLOSE,60)*0.7 + RANK(FINANCE(25)/FINANCE(1))*0.2 + NEWS_SENTIMENT*0.1; INDUSTRY_TH := ADAPTIVE_THRESHOLD(INDUSTRY_MOM, METHOD='quantile', Q=0.75); {——多周期共振PRO(小波变换融合)——} WAVELET_TREND := WAVELET_DECOMPOSE(CLOSE, WINDOW=1440, SCALES=[60,120,240]); MONTH_TREND := WAVELET_TREND[3] > REF(WAVELET_TREND[3],5) AND SLOPE(WAVELET_TREND[3],5) > 0.08; WEEK_DIF := EMA(CLOSE,10) - EMA(CLOSE,24); WEEK_DEA := EMA(WEEK_DIF,7); WEEK_MACD := 2*(WEEK_DIF - WEEK_DEA) * VOL_RATIO; DAY_BREAK := ZSCORE(CLOSE,20) > 2.2 AND CLOSE > UPPER_BAND(CLOSE,20,2); RSI6 := WILDER_RSI(CLOSE,6); DAY_RSI := RSI6 > 68 AND RSI6 < 88; {——风险控制模块(CVaR优化)——} CVaR := HISTORICAL_VAR(CLOSE, CONFIDENCE=0.95, LOOKBACK=252); MAX_DRAWN := ROLLING_MDD(CLOSE,20) < 0.18; LIQUIDITY := MA(VOL,5)/FINANCE(7)*100 > 1.2 AND BID_ASK_SPREAD < 0.008*CLOSE; {——动态信号权重系统——} SIGNAL_WEIGHTS := ARRAY( MONTH_TREND: 0.25, INDUSTRY_MOM>INDUSTRY_TH: 0.2, CROSS(WEEK_MACD,REF(WEEK_MACD,1)*1.05): 0.15, DAY_BREAK: 0.12, DAY_RSI: 0.08, FINANCE(25)/FINANCE(1)>0.48: 0.07, PEG_VAL<0.38: 0.06, DYNPETTM_N<EMA(IND_PE,60)*0.85: 0.05, HOT_INDEX>3.2: 0.04, MAX_DRAWN: 0.03, LIQUIDITY: 0.02 ); FINAL_SIGNAL := SUM_SIGNAL_WEIGHTS(SIGNAL_WEIGHTS) >= 0.92 AND VOL > MA(VOL,20)*2.5 AND CLOSE > MA(CLOSE,60)*1.1;```你的身份是高级编程技术专家,精通各类编程语言,能对编程过程中的各类问题进行分析和解答。我的问题是【我编辑通达信选股代码,你如何深度理解此代码能否选到资金持续流入,股票市场情绪启动,盘中异动启动主升浪的股票,及日线盘中预警选股和盘后选股。用2018-2024年全A股周期回测验证此代码选股逻辑的准确性和胜率,评估月胜率达到多少?评估有效信号准确率达到多少?,同时此代码还有什么可提升的空间,提出可行性的优化建议和方案,去除冗余选股条件,月胜率提高至80%以上,有效信号准确率95%以上,优化选股逻辑和所有参数计算关系和信号触发条件。修正后要求选股胜率达到月胜率提高至80%以上,有效信号准确率95%以上,选到资金持续流入,股票市场情绪启动,盘中异动启动主升浪的股票,及日线盘中预警选股和盘后选股。请帮我检查并全正确代码,生成优化后完整代码。
最新发布
03-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值