小编Ila*_* WS的帖子

我的功能的时间复杂度是多少?

开始研究复杂性,我正在努力解决这个问题:

void what(int n) {
    int i;
    for (i = 1; i <= n; i++) {
        int x = n;
        while (x > 0)
            x -= i;
    }
}
Run Code Online (Sandbox Code Playgroud)

好吧,第一个循环显然是O(n).第一次迭代是O(n),第二次是O(n/2)..而且就像log(n)我猜的那样?这意味着O(n) * O(log(n)) = O(n * log(n)) complexity.我做对了吗?

编辑:(不是重复)我知道Big O是什么.我已经在特定情况下询问了正确的评估.

c algorithm time-complexity

92
推荐指数
4
解决办法
5229
查看次数

棋盘游戏:找到带有限制的红点的最大绿点

场景:

  • 在大小为MxN的棋盘上,有红色和绿色的棋子。

  • 板上的每个正方形可以包含任意数量的任何颜色的块。(我们可以在同一个正方形中有5个-3个绿色和2个红色,例如,绿色,红色或红色,或任何数字)

  • 我正在寻找板上尽可能多的绿色碎片的轴对齐矩形。

  • 但是,矩形所包含的红色块的数量不得超过给定数量。

  • 矩形的一个角必须为(0,0)。

例:

电路板尺寸为6x4,红色部分标记为“ x”,绿色部分标记为“ o”。

      +-+-+-+-+-+-+
    3 | | | | o | x | o |
      +-+-+-+-+-+-+
    2 | o | | x | | | o |
      +-+-+-+-+-+-+
    1 | o | | o | | o | x |
      +-+-+-+-+-+-+
    0 | | o | | x | | x |
      +-+-+-+-+-+-+
       0 1 2 3 4 5
  • 如果我们允许2个红色块,那么(4,2)是一个最佳解决方案,因为(0,0)和(4,2)之间的区域包含5个绿色块和2个红色块。最多有2个红色块的点最多包含5个绿色块。(3,3)也是一个最佳解决方案。

  • 如果我们允许3个红色部分,那么(4,3)是唯一的最佳解决方案,其中包含6个绿色部分。

我得到:

  • 板子尺寸
  • 所有绿色和红色部分的坐标,
  • 允许的红色块数(“ maxRed”)

目标: 对于任何给定的“ maxRed”,该类都应该能够计算坐标(x,y),以使(0,0)和(x,y)之间的轴对齐矩形最多包含“ maxRed”个红色片断,并且绿色块的数量最大。

我的问题:

通过遍历具有最大绿色点和给定最大红色点的所有可能矩阵(以找到最大的三角形)来解决此问题显然效率不高,我正在尝试找到一种无需使用蛮力就能找到该矩阵的方法。 …

python optimization performance numpy

9
推荐指数
1
解决办法
467
查看次数

什么!s || !*是什么意思?(s是char*)

我很难理解这部分意味着什么:

 if (!s || !*s) //What is this?!?!
      {
        printf("\n");
        return;
      }
Run Code Online (Sandbox Code Playgroud)

这是我的主要功能:

#include <conio.h>
#include <stdio.h>
#include <string.h>

void func1(char *s);

int main()
{
    func1("SABABA");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

而我的func1:

void func1(char *s)
{
    int a, b, c;
    if (!s || !*s)
    {
        printf("\n");
        return;
    }
    b = strlen(s);
    while (b>2)
    {
        a = 0;
        if (s[a] == s[b - 1])
        {
            for (c = b - 1; c >= a && s[a] == s[c]; a++, c--);
            if (c<a)
            { …
Run Code Online (Sandbox Code Playgroud)

c string

0
推荐指数
1
解决办法
105
查看次数

检查数字是否可以被 2 整除,如果是,则打印数字

好吧,这是我的一段 ASM 代码:

    MOV AH, 0 ;reset AH before division
    MOV AL,[myNum] ;move the inputed number to AL
    DIV two ;div 123 / 2;
    CMP AH,0
    JNE inputIsPrime

    ;If 123 % 2 = 0, output 123 / 2.
    DIV ten
    MOV DH,AH

    SUB AL,'0'
    MOV AH,2
    MOV DL, AL
    INT 21h

    MOV divisionCalc,DH

    MOV AH,2
    MOV DL,DH
    INT 21h
    JMP endProg
Run Code Online (Sandbox Code Playgroud)

我想在这里实现的是,在我向键盘输入“60”并按 Enter 后,我得到了错误的输出。我想得到数字“30”,因为 60/2 = 30。如果我输入 42,我想得到 21 作为输出。

任何想法为什么我的代码失败?

这是完整的代码:

.MODEL SMALL
.STACK 100h
.DATA

DisplayString DB 'Enter …
Run Code Online (Sandbox Code Playgroud)

x86 assembly dos

0
推荐指数
1
解决办法
4564
查看次数