You are given an array x of n positive numbers. You start at point (0,0) and moves x[0] metres to the north, then x[1] metres to the west, x[2] metres to the south, x[3] metres to the east and so on. In other words, after each move your direction changes counter-clockwise.

Write a one-pass algorithm with O(1) extra space to determine, if your path crosses itself, or not.

Example 1:

Given x = [2, 1, 1, 2],
┌───┐
│ │
└───┼──>
│ Return true (self crossing)

Example 2:

Given x = [1, 2, 3, 4],
┌──────┐
│ │


└────────────> Return false (not self crossing)

Example 3:

Given x = [1, 1, 1, 1],
┌───┐
│ │
└───┼> Return true (self crossing)

这道题给了我们一个一位数组,每个数字是个移动量,按照上左下右的顺序来前进每一个位移量,问我们会不会和之前的轨迹相交,而且限定了常量的空间复杂度,我立马想到了贪吃蛇游戏,但是这条蛇不会自动向前移动哈。言归正传,这题我不会,参考的网上大神们的解法,实际上相交的情况只有以下三种情况:

     x()
┌───┐
x()│ │x()
└───┼──>
x()│

第一类是第四条边和第一条边相交的情况,需要满足的条件是第一条边大于等于第三条边,第四条边大于等于第二条边。同样适用于第五条边和第二条边相交,第六条边和第三条边相交等等,依次向后类推的情况...

      x()
┌──────┐
│ │x()
x()│ ^
│ │x()
└──────│
x()

第二类是第五条边和第一条边重合相交的情况,需要满足的条件是第二条边和第四条边相等,第五条边大于等于第三条边和第一条边的差值,同样适用于第六条边和第二条边重合相交的情况等等依次向后类推...

      x()
┌──────┐
│ │x()
x()│ <│────│
│ x()│x()
└───────────│
x()

第三类是第六条边和第一条边相交的情况,需要满足的条件是第四条边大于等于第二条边,第三条边大于等于第五条边,第五条边大于等于第三条边和第一条边的差值,第六条边大于等于第四条边和第二条边的差值,同样适用于第七条边和第二条边相交的情况等等依次向后类推...

那么根据上面的分析,我们不难写出代码如下:

class Solution {
public:
bool isSelfCrossing(vector<int>& x) {
for (int i = ; i < x.size(); ++i) {
if (x[i] >= x[i - ] && x[i - ] >= x[i - ]) {
return true;
}
if (i >= && x[i-] == x[i-] && x[i] >= x[i-] - x[i-]) {
return true;
}
if (i >= && x[i-] >= x[i-] && x[i-] >= x[i-] && x[i-] >= x[i-] - x[i-] && x[i] >= x[i-] - x[i-]) {
return true;
}
}
return false;
}
};

参考资料:

https://leetcode.com/discuss/88054/java-oms-with-explanation

https://leetcode.com/discuss/88196/re-post-2-o-n-c-0ms-solutions

LeetCode All in One 题目讲解汇总(持续更新中...)

最新文章

  1. Event Sourcing Pattern 事件源模式
  2. linux 常用操作指令(随时更新)
  3. iOS常用设计模式和机制之Block简单使用
  4. 如何在Android应用程序中使用传感器(OpenIntents开源组织SensorSimulator项目)
  5. Sublime Text 3配置记录
  6. mysql索引之唯一索引
  7. 相见恨晚——MarkDown
  8. 《CSS网站布局实录》读书笔记
  9. scrapy 知乎的模拟登陆及抓取用户数据
  10. [测试题]幸运序列(lucky)
  11. 分布式任务调度平台XXL-JOB
  12. elasticsearch开启外网访问
  13. codeforces498C
  14. 微信小程序开发需要注意的30个坑
  15. Spring Boot 如何极简入门?
  16. DELPHI微信支付代码
  17. Hadoop学习笔记(一)——编译安装和配置
  18. Socket缓冲区
  19. webservice gsoap 小记
  20. August 22nd 2017 Week 34th Tuesday

热门文章

  1. Properties操作指南
  2. 9.JAVA之GUI编程列出指定目录内容
  3. Scala集合和Java集合对应转换关系
  4. 通过三个DEMO学会SignalR的三种实现方式
  5. ASP.NET MVC5下载数据到Excel文件
  6. RabbitMQ原理与相关操作(一)
  7. PyQt4入门学习笔记(四)
  8. 25 highest paying companies: Which tech co outranks Google, Facebook and Microsoft?
  9. 【Spring】SpringMVC中浅析Date类型数据的传递
  10. MySQL大数据优化