Arrays 查找一次仅删除一个元素后从父数组生成的已排序数组数
蛮力方法是一次逐个删除每个数字,并检查结果数组是否已排序,并维护此类排序数组的计数。这需要O(n^2)个时间 有没有其他方法可以找到时间小于O(n^2)的计数 注意:在一次只删除一个元素之后,只需要查找此类排序数组的计数 例如: 输入:[1 2 3 4 5 4] 输出:2([12344],[12345]) 输入:[1 2 3 4 2] 输出:1([1 2 3 4])我相信我有一个O(n)时间-算法只对列表执行一次遍历,检查每个元素一次Arrays 查找一次仅删除一个元素后从父数组生成的已排序数组数,arrays,algorithm,sorting,data-structures,Arrays,Algorithm,Sorting,Data Structures,蛮力方法是一次逐个删除每个数字,并检查结果数组是否已排序,并维护此类排序数组的计数。这需要O(n^2)个时间 有没有其他方法可以找到时间小于O(n^2)的计数 注意:在一次只删除一个元素之后,只需要查找此类排序数组的计数 例如: 输入:[1 2 3 4 5 4] 输出:2([12344],[12345]) 输入:[1 2 3 4 2] 输出:1([1 2 3 4])我相信我有一个O(n)时间-算法只对列表执行一次遍历,检查每个元素一次 对于每个元素: 如果下一个元素大于或等于当前元素,请继续
对于每个元素:
- 如果下一个元素大于或等于当前元素,请继续
- 如果下一个元素小于当前元素。。。
- (设置故障位。如果该位已设置,则停止检查。)
- 如果这个元素前面的两个索引是相对于这个元素排序的,这意味着我们可以省略下一个元素,仍然可以进行排序。添加一个匹配项
- 如果此元素后面的元素一索引是相对于此元素前面的元素一索引排序的,这意味着我们可以忽略当前元素并仍然进行排序。添加一个匹配项
一旦完成运行,代码将检查失败位
- 如果未设置失败位,则所有内容都已排序,并且可能列表的数量等于列表中的元素数量李>
- 如果设置了失败位,则至少有一个未排序的元素。记录了匹配的数量
- 如果设置了失败位并且循环提前退出,则至少有两个未排序的元素-不可能进行匹配
示例-步骤顺序相反
步骤1 3 4 6 5 7 8
7^8一个数组中是否可能有两个递减对,且其答案大于0?(递减对是数组中两个相邻的元素,其中较大的是第一个。)您只需要查找违反规则的元素,例如第一个示例中的最后一个元素。然后还要考虑前面索引处的元素。如果没有违规者,即所有内容都已排序,则可以选择任意一个元素。如果有多个,您可以开始分支以备将来通过。失败位逻辑工作,但如果我们跟踪递减对,并且此类对的计数大于1,则不可能解决问题;如果为0,则所有内容都已排序,解决方案为父数组大小;如果是1,则可以生成1或2个排序数组。这个逻辑看起来好吗?@MushiMaster我觉得这个逻辑不错。只要确定匹配的数量,如果它是一对递减的。
EXAMPLE - steps are in reverse order
STEP 1 3 4 6 5 7 8
7 ^ 8<=(end), pass
6 ^ 7<=8, pass
5 ^ 5<=7, pass
4b ^ ^ 6<=7, we can safely omit next element (5) - add match
4a ^ ^ 4<=5, we can safely omit current element (6) - add match
4 ^ 6!<=5, set failure bit
3 ^ 4<=6, pass
2 ^ 3<=4, pass
1 ^ 1<=3, pass